在以下代码中,我想通过点击下面的JButton来让JSplitPane一左一右两个Pane有出现JLabel组件,可点了鼠标后没有任何反应,只有当把此Application最小化后再还原后才能看到这个效果,这是怎么回事,以及如何改正??
package trySplitePane;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;
public class TrySplitePane {
public static void main(String[] args) {
// TODO Auto-generated method stub
new TrySplite().setVisible(true);
}
}
class TrySplite extends JFrame{
TrySplite(){
setTitle("TrySplite");
p.add(label1);
label1.setBorder( BorderFactory.createTitledBorder("Label A"));
p.add(label2);
label2.setBorder( BorderFactory.createTitledBorder("Label B"));
label1.setPreferredSize(new Dimension(250,400));
label2.setPreferredSize(new Dimension(250,400));
c.add(p);
c.add(btn,BorderLayout.SOUTH);
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Button ok! before");
tryS();
System.out.println("Button ok! after");
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(250,200,600,500);
}
void tryS(){
//SwingUtilities.invokeLater(new Runnable (){
//public void run() {
// TODO Auto-generated method stub
split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,label1, label2);
split.setDividerSize(8);
p.add(split);
//}
//});
}
JSplitPane split;
private JLabel label1 = new JLabel(),
label2= new JLabel();
private JButton btn = new JButton("Splite");
JPanel p = new JPanel();
Container c = getContentPane();
}
请高手指正!
谢谢!!!
3 个解决方案
#1
repaint()一下
#2
void tryS(){
//SwingUtilities.invokeLater(new Runnable (){
//public void run() {
// TODO Auto-generated method stub
split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,label1, label2);
split.setDividerSize(8);
p.add(split);
this.validate(); // 添加这句可以了
//}
//});
}
//SwingUtilities.invokeLater(new Runnable (){
//public void run() {
// TODO Auto-generated method stub
split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,label1, label2);
split.setDividerSize(8);
p.add(split);
this.validate(); // 添加这句可以了
//}
//});
}
#3
public void validate()
证此容器及其所有子组件。
使用 validate 方法会使容器再次布置其子组件。已经布置容器后,在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。
API 上面有的,看看吧
证此容器及其所有子组件。
使用 validate 方法会使容器再次布置其子组件。已经布置容器后,在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。
API 上面有的,看看吧
#1
repaint()一下
#2
void tryS(){
//SwingUtilities.invokeLater(new Runnable (){
//public void run() {
// TODO Auto-generated method stub
split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,label1, label2);
split.setDividerSize(8);
p.add(split);
this.validate(); // 添加这句可以了
//}
//});
}
//SwingUtilities.invokeLater(new Runnable (){
//public void run() {
// TODO Auto-generated method stub
split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,label1, label2);
split.setDividerSize(8);
p.add(split);
this.validate(); // 添加这句可以了
//}
//});
}
#3
public void validate()
证此容器及其所有子组件。
使用 validate 方法会使容器再次布置其子组件。已经布置容器后,在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。
API 上面有的,看看吧
证此容器及其所有子组件。
使用 validate 方法会使容器再次布置其子组件。已经布置容器后,在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。
API 上面有的,看看吧