一般想要移除和添加一个组件,可能是希望程序在运行时动态的移除和添加,所以你可以为要移除的组件设置一个监听器。
例如单击某一个组件就移除这个组件,并且添加另外的组件。例如,当单击按钮时,把按钮移除,添加一个文本框。下面是一个具体的例子:
package konw.win
import java.awt.FlowLayout
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import javax.swing.JButton
import javax.swing.JFrame
import javax.swing.JPanel
import javax.swing.JTextField
public class WinTest3
{
public static void main(String[] args)
{
JFrame frame = new JFrame()
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setExtendedState(JFrame.MAXIMIZED_BOTH)
frame.setLayout(new FlowLayout())
JPanel panel = new JPanel()
JButton button = new JButton("change")
panel.add(button)
JTextField f = new JTextField(20)
ActionListener listener = new ChangeListener(button,panel,f)
button.addActionListener(listener)//注册监听器
frame.add(panel)
frame.setVisible(true)
}
}
/*监听器,当单击按钮时,移除button按钮,加入text文本框*/
class ChangeListener implements ActionListener
{
JButton button
JPanel panel
JTextField text
public ChangeListener(JButton button, JPanel panel, JTextField text)
{
super()
this.button = button
this.panel = panel
this.text = text
}
@Override
public void actionPerformed(ActionEvent e)
{
if("change".equals(e.getActionCommand()))
{
panel.remove(button)
panel.add(text)
panel.updateUI()
panel.repaint()
}
}
}
需要特别注意的是移除和添加组件之后,记得重画组件。
用户在拖拽空间生成模板的时候,最终要有保存动作吧?只需要再保存的时候,遍历模板中的控件,与数据库中记录的进行对比,再更新,就行了
对于修改表结构的问题,你也可以放到保存动作中处理
比如你在数据库中存储了某个表最基本的crud语句,一旦表结构变了,更新这些对应的基本语句就行
不知道我对你问题理解的对不对
效果图
参考代码
import java.awt.*import java.awt.event.*
import javax.swing.*
//本类继承自JFrame 实现了 ActionListener接口
public class DemoFrame1 extends JFrame implements ActionListener {
JPanel jpc //存放组件的面板
JScrollPane jsp//滚动面板
JButton jbAdd ,jbRemove,jbReset// 增加,删除按钮
int index = 1//开始的字符
//构造函数
public DemoFrame1() {
jpc = new JPanel()
jpc.setLayout(new BoxLayout(jpc, BoxLayout.Y_AXIS))//盒子布局.从上到下
jsp = new JScrollPane(jpc,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER)
add(jsp)
jbAdd = new JButton("增加")
jbAdd.addActionListener(this)
jbRemove = new JButton("删除")
jbRemove.addActionListener(this)
jbReset = new JButton("重置")
jbReset.addActionListener(this)
JPanel jps = new JPanel()
jps.add(jbAdd)
jps.add(jbRemove)
jps.add(jbReset)
add(jps,BorderLayout.SOUTH)
setTitle("增删组件")
setDefaultCloseOperation(EXIT_ON_CLOSE)
setSize(300, 220)//大小
setLocationRelativeTo(null)//居中
}
//main函数
public static void main(String[] args) {
new DemoFrame1().setVisible(true)//初始化并可见
}
@Override
public void actionPerformed(ActionEvent e) {
JButton jb = (JButton) e.getSource()
if(jb==jbAdd) {//当点击添加按钮时
jpc.add(new MyJPanel(index))//添加1个自己定义的面板组件
index++//自加1
myUpdateUI()//刷新界面
}else if(jb ==jbRemove) {//当点击删除按钮时
if(jpc.getComponentCount()>0) { // 得到jpc里的MyJPanel的组件数量
jpc.remove(jpc.getComponentCount()-1)//删除末尾的一个组件 ,
index-=1
myUpdateUI()
}
}else if(jb==jbReset) {
for (int i = 0 i < jpc.getComponentCount() i++) {
MyJPanel mjp = (MyJPanel) jpc.getComponent(i)
//也就是说取值,可以根据文本框所在的位置来取
System.out.println("第"+(i+1)+"个文本框的值是"+mjp.getJTFValue())
mjp.setJTFValue("")//清空,重置
System.out.println("第"+(i+1)+"个文本框的值已清空重置")
}
}
}
//刷新界面函数
private void myUpdateUI() {
SwingUtilities.updateComponentTreeUI(this)//添加或删除组件后,更新窗口
JScrollBar jsb = jsp.getVerticalScrollBar()//得到垂直滚动条
jsb.setValue(jsb.getMaximum())//把滚动条位置设置到最下面
}
}
//自定义一个JPanle类
class MyJPanel extends JPanel{
public JTextField jtf
public MyJPanel(int index) {
JLabel jl = new JLabel("字符"+index)
jtf = new JTextField(15)
add(jl)
add(jtf)
}
//获取文本框的值
public String getJTFValue() {
return jtf.getText()
}
//设置文本框的值
public void setJTFValue(String value) {
jtf.setText(value)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)