Java 在我的JFrame中还有一个重新绘制的问题
我正在学习Java并测试一个简单的笔记程序。我有一个面板,它在启动时是隐藏的,点击一个按钮就可以看到。但我不能看到这个面板,直到我调整程序窗口的大小!我诚恳地尝试了所有我能在网上找到的东西,但还是没能让它正常运行。代码如下:Java 在我的JFrame中还有一个重新绘制的问题,java,swing,jpanel,repaint,Java,Swing,Jpanel,Repaint,我正在学习Java并测试一个简单的笔记程序。我有一个面板,它在启动时是隐藏的,点击一个按钮就可以看到。但我不能看到这个面板,直到我调整程序窗口的大小!我诚恳地尝试了所有我能在网上找到的东西,但还是没能让它正常运行。代码如下: //Main JFrame "Fenetre" //imports ... public class Fenetre extends JFrame implements ActionListener { private static final long ser
//Main JFrame "Fenetre"
//imports
...
public class Fenetre extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private JPanel west = new JPanel();
private CEPan CEPan = new CEPan();
private JPanel container = new JPanel();
private JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, west, CEPan);
private JButton nouvelleNote = new JButton("Nouvelle note");
public Fenetre() {
this.setMinimumSize(new Dimension(800, 700));
this.setTitle("Notes");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setContentPane(container);
container.setBackground(Color.GREEN);
west.setMinimumSize(new Dimension(100, 700));
west.add(nouvelleNote);
nouvelleNote.addActionListener(this);
CEPan.setMinimumSize(new Dimension(200, 700));
CEPan.setBackground(Color.RED);
split.setDividerSize(4);
container.setLayout(new BorderLayout());
container.add(split, BorderLayout.CENTER);
//At first this panel is hidden until the click of the button
CEPan.setVisible(false);
this.setContentPane(container);
}
public void nouvelleNote() {
CEPan.setVisible(true);
container.repaint();
west.repaint();
this.repaint();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
nouvelleNote();
}
}
CEPan
TextArea
注释
我以前有过这个问题。将所有
repaint
方法调用替换为:
yourJFrame.setVisible(true);
例如:
即使帧已经可见,此方法也会确保所有内容都正确呈现。当已显示
JComponent
并且某些事件导致修改此类JComponent时,避免问题的最佳方法是始终调用repaint()
和revalidate()
在相关部件上。第一种方法导致重新绘制组件,以显示涉及组件外观的任何更改(例如更改颜色),第二种方法通知布局管理器重新计算布局,因为如果某些组件已添加或删除,这是必要的。只需添加一行代码:调整大小(900700)
使您的CEPan
可见后
`public void nouvelleNote() {
CEPan.setVisible(true);
resize(900, 700);
}`
这将调整JFrame的大小,然后它将自动重新绘制并重新验证所有组件。
公共类TextArea扩展了JTextArea{
鉴于存在java.awt.TextArea
,这是一个令人困惑的类名称。此外,工厂方法更适合生成文本区域。只需在根对象上调用repaint()
将重新绘制其所有子对象,因此nouvellente()
应该只调用This.repaint())
或者更好的repaint()
,因为这个意味着“我有一个面板在启动时隐藏,通过点击按钮就可以看到。”使用中所示的方法。@andrewhompson有最好的解决方案,但另一个选项是在repaint()旁边调用revalidate()
在添加或删除组件
s或JComponent
s时,感谢所有有用的注释。结果表明,问题并不完全在于调整窗口大小。只有在调整窗口右侧(更准确地说是CEPan)的大小时,才可以。只有在拖动分隔器时,即使是拖动了一毫米,也不会出现问题CEPan出现了。我仍然不理解这个问题,但我只能通过在单击按钮时实例化JSplitPanel来修补它,否则我只有带按钮的“west”面板
public class Notes {
public static void main(String[] args) {
// TODO Auto-generated method stub
Fenetre fenetre = new Fenetre();
fenetre.pack();
fenetre.setVisible(true);
}
}
yourJFrame.setVisible(true);
public void nouvelleNote() {
CEPan.setVisible(true);
this.setVisible(true);
}
`public void nouvelleNote() {
CEPan.setVisible(true);
resize(900, 700);
}`