当前位置: 首页 > 面试题库 >

在面板内绘制图像

皇甫琛
2023-03-14
问题内容

我有一个带有两个按钮的面板。我正在尝试在面板内插入图像,我想在单击按钮后在图像内画线。我使用了下面的代码,但这似乎不起作用。

public class Try_Panel extends JFrame {
  // start attributes
  private JPanel jPanel1 = new JPanel(null, true);
  private JButton jButton1 = new JButton();
  private JButton jButton2 = new JButton();
  // end attributes

  public Try_Panel(String title) {
    // Frame-Init
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 300; 
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    // start components

    jPanel1.setBounds(48, 24, 209, 145);
    jPanel1.setOpaque(false);
    cp.add(jPanel1);
    jButton1.setBounds(88, 208, 75, 25);
    jButton1.setText("jButton1");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jButton1_ActionPerformed(evt);
      }
    });
    cp.add(jButton1);
    jButton2.setBounds(184, 208, 75, 25);
    jButton2.setText("jButton2");
    jButton2.setMargin(new Insets(2, 2, 2, 2));
    jButton2.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jButton2_ActionPerformed(evt);
      }
    });
    cp.add(jButton2);
    // end components

    setVisible(true);
  } // end of public Try_Panel

  // start methods
  public void jButton1_ActionPerformed(ActionEvent evt) {
      BufferedImage image=new BufferedImage(jPanel1.getWidth(), jPanel1.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
        JLabel l=new JLabel(new ImageIcon(image));
        Graphics graphics = image.getGraphics();
        Graphics2D g = (Graphics2D) graphics;
        g.fillRect(0, 0, image.getWidth(), image.getHeight());
        g.setColor(Color.BLUE);
        g.drawLine(0, 0, 300, 400);
        jPanel1.add(l);
  } // end of jButton1_ActionPerformed

  public void jButton2_ActionPerformed(ActionEvent evt) {
    // TODO add your code here
  } // end of jButton2_ActionPerformed

  // end methods

  public static void main(String[] args) {
    new Try_Panel("Try_Panel");
  } // end of main

} // end of class Try_Panel

最大的问题是我的其他班级使用的相同代码。


问题答案:

尝试imageImageIcon更新后包装内部。同样,Graphics#dispose当您完成对图形上下文的渲染时,还应该调用。

    public void jButton1_ActionPerformed(ActionEvent evt) {
        BufferedImage image=new BufferedImage(jPanel1.getWidth(), jPanel1.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
        Graphics2D g = image.createGraphics();
        g.fillRect(0, 0, image.getWidth(), image.getHeight());
        g.setColor(Color.BLUE);
        g.drawLine(0, 0, 300, 400);
        g.dispose();
        JLabel l=new JLabel(new ImageIcon(image));
        jPanel1.add(l);
    }

您还应该依靠布局管理器,而不是自己动手做,这只会使您的生活更轻松。

就个人而言,我认为将其直接绘制到自定义组件会更容易JPanel。查看执行自定义绘画以获取更多详细信息

用示例更新

基本上,我将您的示例更改为

  1. 使用布局管理器
  2. 在EDT上下文中加载UI
  3. revalidatejPanel1
    public class BadLabel extends JFrame {
        // start attributes

        private JPanel jPanel1 = new JPanel(new BorderLayout(), true);
        private JButton jButton1 = new JButton();
        private JButton jButton2 = new JButton();
        // end attributes

        public BadLabel(String title) {
            // Frame-Init
            super(title);
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            int frameWidth = 300;
            int frameHeight = 300;
            setSize(frameWidth, frameHeight);
            Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
            int x = (d.width - getSize().width) / 2;
            int y = (d.height - getSize().height) / 2;
            setLocation(x, y);
    //        setResizable(false);
            Container cp = getContentPane();
    //        cp.setLayout(null);
            // start components

    //        jPanel1.setBounds(48, 24, 209, 145);
            jPanel1.setOpaque(true);
            jPanel1.setBackground(Color.RED);
            cp.add(jPanel1);

            JPanel buttons = new JPanel();
    //        jButton1.setBounds(88, 208, 75, 25);
            jButton1.setText("jButton1");
            jButton1.setMargin(new Insets(2, 2, 2, 2));
            jButton1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    jButton1_ActionPerformed(evt);
                }
            });
            buttons.add(jButton1);
    //        jButton2.setBounds(184, 208, 75, 25);
            jButton2.setText("jButton2");
            jButton2.setMargin(new Insets(2, 2, 2, 2));
            jButton2.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    jButton2_ActionPerformed(evt);
                }
            });
            buttons.add(jButton2);
            // end components

            cp.add(buttons, BorderLayout.SOUTH);

            setVisible(true);
        } // end of public BadLabel

        // start methods
        public void jButton1_ActionPerformed(ActionEvent evt) {
            BufferedImage image = new BufferedImage(jPanel1.getWidth(), jPanel1.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
            Graphics2D g = image.createGraphics();
            g.fillRect(0, 0, image.getWidth(), image.getHeight());
            g.setColor(Color.BLUE);
            g.drawLine(0, 0, 300, 400);
            g.dispose();
            JLabel l = new JLabel(new ImageIcon(image));
            l.setBorder(new LineBorder(Color.BLUE));
            jPanel1.add(l);
            jPanel1.revalidate();
        } // end of jButton1_ActionPerformed

        public void jButton2_ActionPerformed(ActionEvent evt) {
            // TODO add your code here
        } // end of jButton2_ActionPerformed

        // end methods
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception exp) {
                    }
                    new BadLabel("BadLabel");
                }
            });
        } // end of main
    } // end of class BadLabel}


 类似资料:
  • 问题内容: 在下面,我在框架内部有一个面板。为什么我不能画图?我只是得到一个纯白色的屏幕。如果我摆脱了面板并直接绘制到框架上,那是可行的。任何帮助,将不胜感激。 问题答案: 尝试将事件绑定到面板,而不是整个框架: 您的版本对我来说很有效(Windows),但它会不断重新绘制面板,以致使整个处理器吃光了。 来自文档: 请注意,在绘画事件处理程序中,即使不使用它,应用程序也必须始终创建wxPaintD

  • 更改画笔大小和钢笔压力的不透明度 如果您使用图形绘制绘图板(例如 Wacom® 绘图板),则可以通过钢笔压力、角度、旋转或光笔轮来控制绘画工具。 选择“画笔”、“铅笔” 或其他绘画工具。 在选项栏中,执行下列某个操作: 单击“绘图板压力控制大小”按钮。 单击“绘图板压力控制不透明度”按钮。 注意:选取“窗口”>“画笔”可访问根据钢笔压力而改变角度、流量、散布程度、纹理深度以及描边圆度的其他控制选项

  • 当我运行这个代码时,我看不到椭圆形,我只能看到一个空白的框架。我知道我可以使用方法,但我很想知道为什么我的代码不能工作。

  • 问题内容: 我正在编写一个具有许多不同视图的程序。其中之一是图形密集型(显示互连的图形)。其他人只显示较小但复杂的图表。 我发现主视图的绘制时间很长(甚至只是绘制当前可见的区域),并且在绘制时,界面的其余部分变得很慢。 我的问题是,我可以创建一个新线程来处理绘画吗?如果是这样,是否会导致性能提高,我怀疑它不会。我尝试了以下方法: 创建一个抽象类ThreadPaintablePanel,我的复杂视图

  • 我对Java不熟悉,所以我正在尝试一些事情。 我正在玩Java布局,特别是使用BorderLayout的嵌套面板。 我的问题是,我无法绘制嵌套面板。我可以画到主面板,但不能画嵌套在其中的面板。 如果你能告诉我哪里出了问题,我会非常高兴。 这是我的主要代码: 这是主面板。 然后创建两个嵌套面板,并将其添加到主面板中。 这里我称之为在屏幕上绘制形状的类。 这里是问题,因为我无法绘制嵌套面板的形状。 然

  • 我将用Netbeans GUI-builder制作的GUI转移到Eclipse。我想知道GUI构建器在代码中输入的这条看起来吓人的消息是否仍然相关: