为什么我的fillpolygon形状看起来很奇怪(Java GUI)?
我试图用8个点做一个黑色的多边形,并把它放在按钮下面的中心。我相信我所做的一切都是正确的,但多边形看起来部分受到了冲击,并且不在按钮下居中。有人可以解释为什么它不能正常工作吗?为什么我的fillpolygon形状看起来很奇怪(Java GUI)?
我的覆盖面板创建多边形。
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
class OwnJpanel extends JPanel{
public void paintComponent(Graphics g){
int[] xpoints = {10, 20, 25, 25, 20, 10, 5, 5};
int[] ypoints = {10, 25, 20, 27, 37, 37, 27, 20};
g.setColor(Color.black);
g.fillPolygon(xpoints, ypoints, 8);
}
}
我的主类:
import java.awt.BorderLayout;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main{
public Main(){
JFrame jf = new JFrame();
jf.getContentPane();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(500,500);
OwnJpanel oj1 = new OwnJpanel();
JPanel jp1 = new JPanel();
JButton jb1 = new JButton("Click Once");
//jf.getContentPane().add(BorderLayout.CENTER, oj1); (Attempted this to center the polygon but it continues to be stuck in the left corner
oj1.add(jb1);
jf.add(oj1);
jf.setVisible(true);
}
public static void main(String [] args){
new main();
}
}
最后,有一个JButton具有越过按钮?所以一个划掉按钮(像X,在当前的JButton“点击一次”)。
首先在您的方法中调用super.paintComponent(g);
。
并且不要使用绝对坐标。定义
int centerX=getWidht()/2;
int centerY=getHeight()/2;
然后使用中心坐标来调整您的绘图。例如centerX +东西,centerY +东西作为坐标。
或者,您可以使用g.drawString()传递“X”字符串并居中字符串。
我该如何用这些特定坐标来做到这一点?我需要将它们合并来创建特定的多边形。另外,我怎样才能在“点击一次”按钮下方将它居中? – user3404854 2014-10-06 07:32:19
使用坐标来居中多边形 – StanislavL 2014-10-06 07:35:15
所以,如果我要使用super.paintComponent(g);以及g.fillPolygon(xpoints,ypoints,8);我应该能够用xpoints和ypoints创建一个Polygon,是否正确? – user3404854 2014-10-06 16:14:41
好的,不是试图找出多边形与按钮的关系,而是需要相当多的工作,并且会涉及到必须能够预先计算所需的空间量按钮和多边形将要求,这将是更简单的“作弊”,并利用适当的布局经理为你做的工作... ...
你也不应该依靠“魔术”的数字,应该依靠什么是在运行时实际已知的,例如作为组分
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class PolyTest {
public static void main(String[] args) {
new PolyTest();
}
public PolyTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JButton btn = new JButton("A Button");
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
frame.add(btn, gbc);
frame.add(new PolyPane(), gbc);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class PolyPane extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.translate(5, 5);
int width = getWidth() - 10;
int height = getHeight() - 10;
int x[] = new int[]{
0,
width/10,
width/2,
width - (width/10),
width,
width - (width/4),
width/4};
int y[] = new int[]{
height - (height/3),
height/5,
0,
height/5,
height - (height/3),
height,
height};
g2d.setColor(Color.BLACK);
g2d.drawPolygon(x, y, x.length);
g2d.dispose();
}
}
}
我意识到提供的坐标之一已关闭,所以我得到了多边形的形状。我尝试oj1.setLayout(new BoxLayout(oj1,BoxLayout。Y_AXIS));但为什么不这样做?是不是oj1的面板?你已经展示的是将按钮下方的形状居中的最简单方法?看起来很复杂,可以在几行内完成。 – user3404854 2014-10-06 22:28:47
按照我的设置,“GridBagLayout”的默认行为是将组件居中。因此,如果我将“PolyPane”的首选大小更改为“200x200”,则它们将它们集中在一起,而无需执行任何额外的编码。 “BoxLayout”是另一个野兽...... – MadProgrammer 2014-10-06 22:44:04
你能用下面的实现编辑你的例子吗?类OwnJpanel扩展JPanel public voidComponentComponent(Graphics g){ int [] xpoints = {10,20,25,25,20,10,5,5}; int [] ypoints = {10,25,20,27,37,37,27,20}; g.setColor(Color.black); g.fillPolygon(xpoints,ypoints,8); } } – user3404854 2014-10-06 23:04:36
*“最后,是否有JButton与按钮交叉?所以一个划掉的按钮“*你的意思是”+“还是”X“? – MadProgrammer 2014-10-06 05:02:23
该按钮由面板布局管理器控制,所以它很可能放在布局管理器决定应该放在哪里。你想创建? – MadProgrammer 2014-10-06 05:05:11
@MadProgrammer我的意思是X.我试图创建一个黑色的8点多边形。 – user3404854 2014-10-06 05:17:43