Olc*_*taş 2 java swing java-2d jpanel paintcomponent
我有一个使用Netbeans的GUI构建器创建的JFrame,它只包含一个JPanel.我创建了一个getPanel获取此JPanel引用的方法:
public class ShowDrawings extends JFrame {
public ShowDrawings() {
initComponents();
}
public JPanel getPanel(){
return panel;
}
private JPanel panel;
}
Run Code Online (Sandbox Code Playgroud)
在我的主要功能中我正在做:
public class Main {
public static void main(String[] args){
ShowDrawings sd = new ShowDrawings();
sd.setSize(800, 600);
Graphics g = sd.getPanel().getGraphics();
g.setColor(Color.BLACK);
g.drawOval(400, 300, 50, 50);
sd.getPanel().paint(g);
sd.repaint();
sd.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
但它没有任何吸引力.请帮我.我已经看了一些相关的问题,但他们都建议扩展JPanel和覆盖其paint方法.但我不想这样做.谢谢.
我已经看了一些相关的问题,但他们都建议扩展
JPanel和覆盖其paint方法.但我不想这样做
你不应该覆盖JPanel paint()方法paintComponent(..).这是最佳实践,如果您希望代码不会产生异常,则应该这样做.在你当前的方法中做到这一点(正如你所看到的那样)使得创建持久性绘图变得更加困难,因为它们被抹去了repaint()
而是延伸JPanel并覆盖paintComponent(Graphics g)不要忘记super.paintComponent(g)在重写paintComponent(..)方法中调用第一个调用.也不要忘记覆盖getPreferredSize(),JPanel以便我们可以返回正确的尺寸,并pack()可以调用JFrame(+1到@mKorbels评论):
这是一些示例代码:

import java.awt.Color;
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 Test {
public Test() {
initComponents();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
private void initComponents() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel testPanel = new JPanel() {
@Override
protected void paintComponent(Graphics grphcs) {
super.paintComponent(grphcs);
Graphics2D g2d = (Graphics2D) grphcs;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.GREEN);
//g2d.drawOval(10,10,100,100);//I like fill :P
g2d.fillOval(10,10,100,100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(150, 150);
}
};
frame.add(testPanel);
frame.pack();
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)