我无法在Java程序中的面板/画布/窗口上绘制图形/文本(使用swing)。
我甚至尝试将其分解为两个类,一个类中的paintComponent(扩展JPanel),另一个类中的其他东西(扩展JFrame)。
我尝试过带画布和不带画布的面板(结果相同)。
我无法在蓝色区域绘制任何东西。 如果我没记错的话,当我在没有面板的情况下尝试它时,我确实看到了图形。 我已经成功地完成了这个文本程序(没有窗口),甚至是一个Android应用程序(我认为Android应用程序很难,但与此相比这很容易)。
我意识到我可以使用JLabel的来做我需要的文本,或者可能是一个编辑框/编辑文本(无论摇摆等价物是什么),但我是一个面向图形的人,所以我想知道如何在Java中做图形(对于任何未来的项目)。
这是我的代码(我只用 Java 编码了 4 天,所以请原谅任何糟糕的风格等。 顺便说一句,我将一些变量更改为类似全局的变量,并公开了尝试让它工作的内容,所以也请原谅:-)另外,我最初有单独的过程来创建按钮、菜单等,但后来我把它们都放在一个过程中,以防出现问题,所以也请原谅。
import java.util.Random;
import java.util.Date;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
public class cookiewin extends JPanel
{
static int randc = 1;
static JButton b1, b2;
JMenuBar menubar = null;
static JFrame win = null;
static JPanel panel = null, drawa = null;
static Graphics2D g2n = null;
//static Graphics g2=null;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLACK);
g2.drawString("This is a test", 20, 100);
g2.drawLine(10, 10, 290, 290);
}
protected static ImageIcon createImageIcon(String path) {
java.net.URL URL = TestPaint.class.getResource(path);
if (URL != null) {
return (new ImageIcon(URL));
} else {
System.err.println("Can't open '" + path + "'n");
return (null);
}
}
public TestPaint() {
Graphics g3;
Container con;
win = new JFrame("Fortune Cookie");
win.setSize(640, 480);
win.setLocation(100, 100);
win.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
win.setDefaultLookAndFeelDecorated(true);
menubar = new JMenuBar();
JMenu menu = new JMenu("Options");
menubar.add(menu);
JMenuItem menuitem = new JMenuItem("Quit");
menuitem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.out.println("Menuitem1n");
win.dispose();
}
});
menu.add(menuitem);
menu.addSeparator();
JMenuItem menuitem2 = new JMenuItem("About");
menuitem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.out.println("Menuitem2n");
}
});
menu.add(menuitem2);
win.setJMenuBar(menubar);
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
Color backcol = new Color(90, 0, 0);
panel.setBackground(backcol);
con = win.getContentPane();
con.add(panel, BorderLayout.EAST);
drawa = new JPanel();
drawa.setPreferredSize(new Dimension(462, 0));
drawa.setBorder(BorderFactory.createLineBorder(Color.yellow, 2));
drawa.setBackground(Color.blue);
win.setBackground(Color.magenta);
JPanel panel2 = new JPanel();
panel2.setBackground(backcol);
panel2.setPreferredSize(new Dimension(400, 80));
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
try {
InputStream is = new FileInputStream("deng_th_.ttf");
Font font = Font.createFont(Font.TRUETYPE_FONT, is);
Color textcol = new Color(255, 255, 0);
JLabel nulltext = new JLabel(" ");
nulltext.setFont(font.deriveFont(38f));
panel2.add(nulltext);
JLabel titletext = new JLabel(" Fortune Cookie:");
titletext.setFont(font.deriveFont(24f));
titletext.setForeground(textcol);
panel2.add(titletext);
} catch (IOException ex) {
System.out.println("Font File Error:");
} catch (FontFormatException ex) {
System.out.println("Font Error:");
}
con.add(panel2, BorderLayout.NORTH);
JPanel panel3 = new JPanel();
panel3.setBackground(backcol);
panel3.setPreferredSize(new Dimension(400, 10));
con.add(panel3, BorderLayout.SOUTH);
JPanel panel4 = new JPanel();
panel4.setBackground(backcol);
panel4.setPreferredSize(new Dimension(10, 400));
con.add(panel4, BorderLayout.WEST);
b1 = new JButton("Another");
b1.setToolTipText("Get another fortune cookie");
b1.setPreferredSize(new Dimension(150, 48));
b1.setMinimumSize(new Dimension(150, 48));
b1.setMaximumSize(new Dimension(150, 48));
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.out.println("Button1n");
}
});
ImageIcon b2i = createImageIcon("rand.jpg");
b2 = new JButton("Non-Random", b2i);
b2.setToolTipText("Toggle random selection");
b2.setPreferredSize(new Dimension(150, 48));
b2.setMinimumSize(new Dimension(150, 48));
b2.setMaximumSize(new Dimension(150, 48));
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.out.println("Button2n");
randc = 1 - randc;
if (randc == 0) {
b2.setText("Random");
} else {
b2.setText("Non-Random");
}
}
});
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
panel.add(b1);
panel.add(Box.createRigidArea(new Dimension(0, 10)));
panel.add(b2);
Canvas can = new Canvas();
Color cancol = new Color(220, 220, 220);
can.setBackground(cancol);
drawa.add(can);
con.add(drawa, BorderLayout.CENTER);
win.setIconImage(new ImageIcon("rand.png").getImage());
win.setVisible(true);
}
public static void main(String[] args) {
int i, numcook = 0, x, y;
int[] cookiepos = new int[500];
Random ranGen2 = new Random();
long seed;
File fp = new File("cookie.idx");
new TestPaint();
}
}
您基本上完全忽略了带有自定义油漆的组件。 无需向其添加面板即可生成此 UI。
这意味着永远不会调用您的paintComponent
方法。
从cookiewin
窗格中取出所有 UI 创建代码并将其放置在其他地方,然后将cookiewin
面板添加到某个地方......
并以身作则
public class TestPaint {
protected static ImageIcon createImageIcon(String path) {
java.net.URL URL = TestPaint.class.getResource(path);
if (URL != null) {
return (new ImageIcon(URL));
} else {
System.err.println("Can't open '" + path + "'n");
return (null);
}
}
private JFrame win;
private JMenuBar menubar;
private JPanel panel;
private Container con;
private JPanel drawa;
private JButton b1;
private JButton b2;
public TestPaint() {
win = new JFrame("Fortune Cookie");
win.setSize(640, 480);
win.setLocation(100, 100);
win.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
win.setDefaultLookAndFeelDecorated(true);
menubar = new JMenuBar();
JMenu menu = new JMenu("Options");
menubar.add(menu);
JMenuItem menuitem = new JMenuItem("Quit");
menuitem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.out.println("Menuitem1n");
win.dispose();
}
});
menu.add(menuitem);
menu.addSeparator();
JMenuItem menuitem2 = new JMenuItem("About");
menuitem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.out.println("Menuitem2n");
}
});
menu.add(menuitem2);
win.setJMenuBar(menubar);
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
Color backcol = new Color(90, 0, 0);
panel.setBackground(backcol);
con = win.getContentPane();
con.add(panel, BorderLayout.EAST);
drawa = new JPanel();
drawa.setPreferredSize(new Dimension(462, 0));
drawa.setBorder(BorderFactory.createLineBorder(Color.yellow, 2));
drawa.setBackground(Color.blue);
win.setBackground(Color.magenta);
JPanel panel2 = new JPanel();
panel2.setBackground(backcol);
panel2.setPreferredSize(new Dimension(400, 80));
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
try {
InputStream is = new FileInputStream("deng_th_.ttf");
Font font = Font.createFont(Font.TRUETYPE_FONT, is);
Color textcol = new Color(255, 255, 0);
JLabel nulltext = new JLabel(" ");
nulltext.setFont(font.deriveFont(38f));
panel2.add(nulltext);
JLabel titletext = new JLabel(" Fortune Cookie:");
titletext.setFont(font.deriveFont(24f));
titletext.setForeground(textcol);
panel2.add(titletext);
} catch (IOException ex) {
System.out.println("Font File Error:");
} catch (FontFormatException ex) {
System.out.println("Font Error:");
}
con.add(panel2, BorderLayout.NORTH);
JPanel panel3 = new JPanel();
panel3.setBackground(backcol);
panel3.setPreferredSize(new Dimension(400, 10));
con.add(panel3, BorderLayout.SOUTH);
JPanel panel4 = new JPanel();
panel4.setBackground(backcol);
panel4.setPreferredSize(new Dimension(10, 400));
con.add(panel4, BorderLayout.WEST);
b1 = new JButton("Another");
b1.setToolTipText("Get another fortune cookie");
b1.setPreferredSize(new Dimension(150, 48));
b1.setMinimumSize(new Dimension(150, 48));
b1.setMaximumSize(new Dimension(150, 48));
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.out.println("Button1n");
}
});
ImageIcon b2i = createImageIcon("rand.jpg");
b2 = new JButton("Non-Random", b2i);
b2.setToolTipText("Toggle random selection");
b2.setPreferredSize(new Dimension(150, 48));
b2.setMinimumSize(new Dimension(150, 48));
b2.setMaximumSize(new Dimension(150, 48));
b2.addActionListener(new ActionListener() {
private int randc;
public void actionPerformed(ActionEvent evt) {
System.out.println("Button2n");
randc = 1 - randc;
if (randc == 0) {
b2.setText("Random");
} else {
b2.setText("Non-Random");
}
}
});
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
panel.add(b1);
panel.add(Box.createRigidArea(new Dimension(0, 10)));
panel.add(b2);
// Canvas can = new Canvas();
Color cancol = new Color(220, 220, 220);
// can.setBackground(cancol);
// drawa.add(can);
con.add(drawa, BorderLayout.CENTER);
con.add(new CustomPaint(), BorderLayout.NORTH);
win.setIconImage(new ImageIcon("rand.png").getImage());
win.setVisible(true);
}
public static void main(String[] args) {
int i, numcook = 0, x, y;
int[] cookiepos = new int[500];
Random ranGen2 = new Random();
long seed;
File fp = new File("cookie.idx");
new TestPaint();
}
public class CustomPaint extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLUE);
g2.fillRect(0, 0, getWidth(), getHeight());
g2.setColor(Color.WHITE);
FontMetrics fontMetrics = g2.getFontMetrics();
g2.drawString("This is a test", 20, fontMetrics.getAscent());
g2.drawLine(10, 10, 290, 290);
}
}
}