代码之家  ›  专栏  ›  技术社区  ›  C. E.

如果resizable设置为false,则不显示Java Swing应用程序按钮

  •  1
  • C. E.  · 技术社区  · 15 年前

    我有以下代码。类KochSnowflakesMenu是一个带有三个按钮的网格JPanel。类KochSnowflakesDraw当前使用drawOval绘制圆:

    import javax.swing.*;
    import java.awt.*;
    
    public class KochSnowflakes
    {
        public static void main(String[] args)
        {
            JFrame frame = new JFrame("Koch Snowflakes");
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setBounds(0,0, 600, 425);
            frame.setBackground(Color.BLACK);
            frame.setResizable(false);
            frame.setLayout(null);
    
            // Create the button interface
            frame.add(new KochSnowflakesMenu());
            frame.add(new KochSnowflakesDraw());
            frame.repaint();
        }
    }
    

    如果我注释掉frame.setResizable(false),则此操作有效。当我不在的时候,按钮就不会出现。为什么?如您所见,我已经尝试使用repaint()。我以前有一个问题,按钮不会出现,直到我手动调整窗口大小。。。

    另外,作为一个额外的问题,如果有人能告诉我如何获得JPanel的维度,那将是非常棒的。我不能使用可调整大小的布局管理器(如BorderLayout,这正是我想要使用的)的原因是,我无法计算占据中心的JPanel的尺寸(因此不知道如何放大来绘制我正在绘制的东西)。

    编辑: 根据要求,这里是KockSnowflakesMenu课程:

    import javax.swing.*;
    import java.awt.*;
    
    public class KochSnowflakesMenu extends JPanel
    {
        public KochSnowflakesMenu()
        {
            setLayout(new GridLayout(3,1));
            setBounds(0,0,200,400);
    
            JButton button_red = new JButton("Red");
            JButton button_yellow = new JButton("Yellow");
            JButton button_blue = new JButton("Blue");
    
            add(button_red);
            add(button_yellow);
            add(button_blue);
        }
    }
    

    而且,为了确保我没有把科奇斯诺夫莱克斯德劳搞砸,这节课也是:

    import javax.swing.*;
    import java.awt.*;
    
    public class KochSnowflakesDraw extends JPanel
    {
        public KochSnowflakesDraw()
        {
            setLayout(null);
            setBounds(200, 0, 400, 400);
        }
    
        public void paintComponent(Graphics g)
        {
            g.setColor(Color.RED);
            g.drawOval(0,0,400, 400);
        }
    }
    
    4 回复  |  直到 15 年前
        1
  •  0
  •   karakuricoder    15 年前

    在前面的答案中添加更多信息。。。 在绘制组件之前,大小是随机的,因此请确保在帧上有一个setVisible(true)。这是您的代码和一些修改,允许您使用BorderLayout并获得绘图面板的大小。我用一些假按钮代替你的界面,但你会明白的。

    
    JFrame frame = new JFrame("Koch Snowflakes");
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(0,0, 600, 425);
    frame.setBackground(Color.BLACK);
    frame.setResizable(false);
    frame.setLayout(new BorderLayout());
    
    JPanel buttons = new JPanel(new FlowLayout());
    buttons.add(new JButton("MENU"));
    buttons.add(new JButton("DRAW"));
    frame.add(buttons, BorderLayout.SOUTH);
    
    JPanel drawArea = new JPanel();
    drawArea.setBackground(Color.BLUE);
    frame.add(drawArea, BorderLayout.CENTER);
    frame.setVisible(true);
    Dimension drawAreaDim = drawArea.getSize();
    System.out.println(drawAreaDim);
    
        2
  •  1
  •   Codemwnci    15 年前

    一般来说,在使用JFrame时,应该使用contentPane,而不是JFrame本身,因此要添加项,请尝试

    frame.getContentPane().add(.....);
    

    对于第一个问题,尝试在JFrame上使用pack。 http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Window.html#pack ()

    对于您的附加问题,JComponent有一个getWidth和getHeight方法。这将告诉你JPanel的当前大小。

    http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JComponent.html#getWidth ()

        3
  •  0
  •   camickr    15 年前

    将组件添加到可见框架时,代码应类似于:

    panel.add(...);
    panel.revalidate();
    panel.repaint(); // sometimes required
    
        4
  •  0
  •   Joshua McKinnon    15 年前

    确保在 Event Dispatch Thread (美国东部时间)。在你的例子中,你不是,而且当你有奇怪的,不一致的行为时,那通常是候选人。Swing不是线程安全的,它依赖于EDT上Swing对象的创建和修改。

    要解决此问题,只需将主方法的内容包装在SwingUtilities.invokeLater调用中,如下所示:

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run()
            {
                JFrame frame = new JFrame("Koch Snowflakes");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setBounds(0,0, 600, 425);
                frame.setBackground(Color.BLACK);
                frame.setResizable(false);
                frame.setLayout(null);
    
                // Create the button interface
                frame.add(new KochSnowflakesMenu());
                frame.add(new KochSnowflakesDraw());
                frame.setVisible(true);
            }
        });
    }
    

    这将在EDT线程上创建JFrame和其他组件。这是否解决了不一致的“大多数情况下不起作用”行为?

    另外,我更喜欢叫setVisible last…尽管这可能不重要。