[英]Can't draw lines on existing panel
我正在用Swing編寫我的第一個Java GUI。 我正在嘗試創建一個10X10點的面板,並在這些點上繪制線條。
問題是我只能創建上述之一。 這意味着我可以創建一個10X10點的矩陣或創建線條。
這是我的代碼:
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("DrawMatrix");
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new DrawRectPanel());
frame.setSize(240, 260);
frame.setVisible(false);
frame.getContentPane().add(new DrawLine());
frame.setVisible(true);
}
}
public class DrawRectPanel extends JPanel{
final static int DIST = 20;
final static int MAX_ROW = 11;
final static int MAX_COL = 11;
int i = 1;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
{
// Points matrix
int x = 0;
for(int row = 1; row < MAX_ROW; row++)
{
x = row * DIST;
for(int col = 1; col < MAX_COL; col++)
{
int y = col * DIST;
g.setColor(Color.blue);
g.drawLine(x,y,x,y+1);
}
}
}
}
}
public class DrawLine extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(20,20,40,40);
}
}
知道為什么嗎? 我應該以不同的方式使用setVisible嗎?
在連續調用add(..)
您將覆蓋添加到contentPane的每個組件。
我希望他們兩個都在中心,因為我想從一點到另一點繪制線條
您應該使用需要單個DrawingPanel
,可以將對象繪制到該方法。 您可能還需要一個數組來保存要繪制的形狀,因此可以很容易地獲取和操作paintComponent(..)
。
請記住通過SwingUtilities.inovkeLater(..)
在Event Dispatch Thread上創建和操作所有Swing組件
不要在JFrame
上調用setSize()
而是在設置JFrame
可見之前調用pack()
,而是覆蓋JPanel
getPrefferedSize
或setPrefferedSize
,並返回適合所有繪圖的維度。
不需要getContentPand.add(..)
只需在JFrame
上調用add(..)
,因為調用將被定向到contentPane
這是一個例子(基本上你用以上修復代碼)
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setTitle("DrawMatrix");
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new DrawPanel());
frame.pack();
frame.setVisible(true);
}
});
}
}
class DrawPanel extends JPanel {
final static int DIST = 20;
final static int MAX_ROW = 11;
final static int MAX_COL = 11;
int i = 1;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Points matrix
int x = 0;
for (int row = 1; row < MAX_ROW; row++) {
x = row * DIST;
for (int col = 1; col < MAX_COL; col++) {
int y = col * DIST;
g.setColor(Color.blue);
g.drawLine(x, y, x, y + 1);
}
}
g.drawLine(20, 20, 40, 40);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.