1

图形继续在标题栏中呈现。我使用封装在 jlabel 中的缓冲图像,并使用生成的图形对象在我的代码中绘制矩形。这是 jframe 类构造函数的重要部分:

super();
        BufferedImage image=new BufferedImage(680,581,BufferedImage.TYPE_INT_ARGB);
        m_graphicsObject =image.getGraphics();

        JLabel label=new JLabel(new ImageIcon(image));

        // buttons, mouse events and other controls use listeners to handle actions
        // these listener are classes
        btn1 = new JButton("Go!");
        //btn1.setPreferredSize(new Dimension(100, 30));
        btn1.addActionListener(new button_go_Click()); //listener 1

        btn2 = new JButton("Clear!");
        //btn2.setPreferredSize(new Dimension(100, 30));
        btn2.addActionListener(new button_clear_Click()); //listener 2

        //always add created buttons/controls to form
        JPanel panel=new JPanel(new GridLayout(20,2));
        panel.add(btn1);
        panel.add(btn2);

        Container pane = this.getContentPane();

        pane.add(label);
        pane.add(panel, BorderLayout.EAST);
        this.setSize(680,581);
        this.setVisible(true);
4

2 回答 2

2

问题是您在设置框架的大小时没有考虑框架的边框(可能还有菜单栏)......

而不是使用this.setSize(680,581)which is 会导致图像呈现在框架边界内(并超出到不可见的空间),您应该简单地调用JFrame#pack并让框架决定如何最好地自行调整大小(基于其内容的首选大小)

在此处输入图像描述在此处输入图像描述

左侧,绝对尺寸,右侧首选尺寸

public class SimpleImageLabel {

    public static void main(String[] args) {
        new SimpleImageLabel();
    }

    public SimpleImageLabel() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JLabel imageLabel = new JLabel();

                try {
                    imageLabel.setIcon(new ImageIcon(ImageIO.read(new File("/path/to/image"))));
                } catch (Exception e) {
                }


                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(imageLabel);
                frame.pack();  // <-- The better way
//                frame.setSize(imageLabel.getPreferredSize()); // <-- The not better way
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }


}
于 2012-11-09T21:15:19.950 回答
-2

正如我之前提到的,你应该设置你的JLabel使用位置

aJLabel.setLocation(Point p)

或者

aJLabel.setLocation(int x, int y)

如果您的图像太大,您也需要调整它的大小以获得良好的位置(:

此致。

于 2012-11-09T18:00:21.707 回答