【问题标题】:Can't add Graphics into JPanel in Java无法在 Java 中将图形添加到 JPanel
【发布时间】:2020-01-03 01:16:25
【问题描述】:

我正在为我一直在做的宠物项目编写 UI,我正在尝试使用 java 图形、绘制线条、形状和其他东西。而且,我整天都在尝试在 Jpanel 中插入一个简单的行,但仍然没有弄清楚出了什么问题。

package thuake;


import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.Paint;
import java.awt.Polygon;
import java.awt.geom.Line2D;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Main extends JFrame{
     static Dimension DEFAULT_SIZE = new Dimension(530, 320);
    static JFrame Frame1 = new JFrame();
    static JScrollPane spanel = new JScrollPane();
     static JPanel Panel1 = new JPanel();
     static MenuBar menu = new MenuBar();
     static Menu menusub1 = new Menu("Open");
    public static void main(String[] args)
    {   

        start();


    }
    public static void start (){

        Frame1.setLayout(new FlowLayout(FlowLayout.CENTER,5,10));
spanel.add(new draw());
        Frame1.add(spanel);
        spanel.setBorder(BorderFactory.createLineBorder(Color.black));
        spanel.setPreferredSize(new Dimension(500, 500));
         Frame1.add(new JButton("ad"));
         Frame1.add(new JButton("ad"));
         Frame1.add(new JButton("ad"));
         Frame1.add(new draw());
        Frame1.setMenuBar(menu);
        menu.add(menusub1);
        Frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Frame1.pack();
        spanel.setVisible(true);
        Frame1.setVisible(true);     
        System.out.println();
    }
    static class draw extends Component {

        public void paint(Graphics g) {

            Graphics2D line = (Graphics2D)g;
            line.drawLine(0, 0, 120, 120);

        }

          }
}

【问题讨论】:

标签: java swing


【解决方案1】:

这是您在绘制图形时应遵循的基本框架。

重点是:

  1. 不要扩展 JFrame,使用单独的实例。
  2. 覆盖 paintComponent() 而不是 paint()
  3. 在 EDT 中启动进程。在 EDT 中完成所有挥杆动作。
  4. 请勿在 EDT 之外或使用您自己检索的图形上下文进行绘制。始终使用来自paintComponent() 的那个
  5. 为面板设置width and height (dimension) 而不是JFrame。原因是JFrame 上的那些尺寸包括粗边框。对于JPanel,您可以获得全宽。

在某些时候,您可以修改它并向 JFrame 和/或 JPanel 添加其他组件。目前,这应该为实验提供一个基础。

您还应该阅读以下内容以及我省略的所有内容。查看Java Tutorials,了解有关图形和绘画的更多信息。

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Template extends JPanel  {
   final static int    height = 500;
   final static int    width  = 500;
   final static String title  = "title";
   JFrame              frame  = new JFrame(title);

   public static void main(String[] args) {
      // start on the EDT
      SwingUtilities.invokeLater(() -> new Template().start());
   }

   public Template() {
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(this); // add the panel
      setPreferredSize(new Dimension(width, height));
      frame.pack();
      // center on screen
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public void paintComponent(Graphics g) {
      super.paintComponent(g); // always do this
      Graphics2D g2d = (Graphics2D) g.create();

      // Optional.  It averages the edges of a figure to give a smoothing effect
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

      // do something here.
      g2d.setColor(Color.red);
      g2d.fillRect(200,200,100,100);

      g2d.dispose();

   }

}

【讨论】:

  • 除非您尝试某种动态调整大小,否则我建议您覆盖getPreferredSize 而不是使用setPreferredSize,这样您就可以控制调整大小提示,而不必担心某些“聪明”的开发人员会更改它。我还建议面板不应该创建框架,但我明白这只是一个例子;)
  • 感谢您对有关摇摆的某些事情的许可,我在网上查看了一些简化的示例,并认为我可以直接进入并做,但现在我认为在尝试之前需要进一步阅读现在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 2018-01-14
  • 2018-09-02
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
相关资源
最近更新 更多