Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在我的JFrame中还有一个重新绘制的问题_Java_Swing_Jpanel_Repaint - Fatal编程技术网

Java 在我的JFrame中还有一个重新绘制的问题

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

我正在学习Java并测试一个简单的笔记程序。我有一个面板,它在启动时是隐藏的,点击一个按钮就可以看到。但我不能看到这个面板,直到我调整程序窗口的大小!我诚恳地尝试了所有我能在网上找到的东西,但还是没能让它正常运行。代码如下:

//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);
 }`