Java - Swing Layout + AWT - 如何在使用布局定位的 JPanel 中画一条线?
Java - Swing Layout + AWT - How to draw a line in a JPanel that was positioned with layouts?
出于另一个程序的目的,我需要在屏幕上绘制几条线,该屏幕具有使用增量绘画和布局构建的图像。由于线条非常直接而且只有几条,我想使用 JPanel 的绘画 space 来做到这一点。由于这不起作用,我制作了一个测试程序来尝试使其起作用,但我似乎仍然无法弄清楚为什么它不起作用。
这是我的测试程序:
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.Dimension;
class TestMain{
public static void main(String[]args){
TestingComponent tester = new TestingComponent();
}
}
class Block extends JPanel{
Block(){
setOpaque(true);
}
public void paintComponent(Graphics gr){
super.paintComponent(gr);
if(getBackground() == Color.white){
System.out.println("Reached");
gr.drawLine(getX(), getY(), getX() + getWidth(), getY() + getHeight());
}
}
}
class TestingComponent{
TestingComponent(){
JFrame frmMain = new JFrame("testing");
frmMain.setSize(Toolkit.getDefaultToolkit().getScreenSize());
JPanel pnlMain = new JPanel();
Block block = new Block();
Dimension dmsDim = new Dimension(16, 16);
pnlMain.setPreferredSize(dmsDim);
frmMain.add(pnlMain);
pnlMain.setLayout(new GridLayout(2, 2));
for(int index = 0; index < 4; index++){
block = new Block();
switch(index){
case 0:
block.setBackground(Color.black);
break;
case 1:
block.setBackground(Color.blue);
break;
case 2:
block.setBackground(Color.green);
break;
case 3:
block.setBackground(Color.white);
break;
}
pnlMain.add(block);
}
frmMain.setVisible(true);
}
}
Versions/Programs 我正在使用(在测试程序中)-
Java 8
记事本
命令提示符
看到 drawLine 方法如此简单,我几乎可以肯定这是由于布局的原因,但除了这一点,我不知道为什么没有画线。 System.out.println("Reached");正在输出,所以程序肯定到达gr.drawLine().
要清楚地说明问题...为什么不画线?我该如何解决这个问题?
您使用错误的点来画线
getX()
和 getY()
return 您的组件 (Block
) 在父组件上的位置。
并且因为您将绘图分成两部分,所以 getX()
return 是面板最右边的坐标,getY()
return 是最上面的坐标。
使用gr.drawLine(0, 0, getWidth(), getHeight());
画线
出于另一个程序的目的,我需要在屏幕上绘制几条线,该屏幕具有使用增量绘画和布局构建的图像。由于线条非常直接而且只有几条,我想使用 JPanel 的绘画 space 来做到这一点。由于这不起作用,我制作了一个测试程序来尝试使其起作用,但我似乎仍然无法弄清楚为什么它不起作用。
这是我的测试程序:
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.Dimension;
class TestMain{
public static void main(String[]args){
TestingComponent tester = new TestingComponent();
}
}
class Block extends JPanel{
Block(){
setOpaque(true);
}
public void paintComponent(Graphics gr){
super.paintComponent(gr);
if(getBackground() == Color.white){
System.out.println("Reached");
gr.drawLine(getX(), getY(), getX() + getWidth(), getY() + getHeight());
}
}
}
class TestingComponent{
TestingComponent(){
JFrame frmMain = new JFrame("testing");
frmMain.setSize(Toolkit.getDefaultToolkit().getScreenSize());
JPanel pnlMain = new JPanel();
Block block = new Block();
Dimension dmsDim = new Dimension(16, 16);
pnlMain.setPreferredSize(dmsDim);
frmMain.add(pnlMain);
pnlMain.setLayout(new GridLayout(2, 2));
for(int index = 0; index < 4; index++){
block = new Block();
switch(index){
case 0:
block.setBackground(Color.black);
break;
case 1:
block.setBackground(Color.blue);
break;
case 2:
block.setBackground(Color.green);
break;
case 3:
block.setBackground(Color.white);
break;
}
pnlMain.add(block);
}
frmMain.setVisible(true);
}
}
Versions/Programs 我正在使用(在测试程序中)-
Java 8
记事本
命令提示符
看到 drawLine 方法如此简单,我几乎可以肯定这是由于布局的原因,但除了这一点,我不知道为什么没有画线。 System.out.println("Reached");正在输出,所以程序肯定到达gr.drawLine().
要清楚地说明问题...为什么不画线?我该如何解决这个问题?
您使用错误的点来画线
getX()
和 getY()
return 您的组件 (Block
) 在父组件上的位置。
并且因为您将绘图分成两部分,所以 getX()
return 是面板最右边的坐标,getY()
return 是最上面的坐标。
使用gr.drawLine(0, 0, getWidth(), getHeight());
画线