2014-10-06 177 views
-1

我试图用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“点击一次”)。

+0

*“最后,是否有JButton与按钮交叉?所以一个划掉的按钮“*你的意思是”+“还是”X“? – MadProgrammer 2014-10-06 05:02:23

+0

该按钮由面板布局管理器控制,所以它很可能放在布局管理器决定应该放在哪里。你想创建? – MadProgrammer 2014-10-06 05:05:11

+0

@MadProgrammer我的意思是X.我试图创建一个黑色的8点多边形。 – user3404854 2014-10-06 05:17:43

回答

2

首先在您的方法中调用super.paintComponent(g);

并且不要使用绝对坐标。定义

int centerX=getWidht()/2; 
int centerY=getHeight()/2; 

然后使用中心坐标来调整您的绘图。例如centerX +东西,centerY +东西作为坐标。

或者,您可以使用g.drawString()传递“X”字符串并居中字符串。

+0

我该如何用这些特定坐标来做到这一点?我需要将它们合并来创建特定的多边形。另外,我怎样才能在“点击一次”按钮下方将它居中? – user3404854 2014-10-06 07:32:19

+0

使用坐标来居中多边形 – StanislavL 2014-10-06 07:35:15

+0

所以,如果我要使用super.paintComponent(g);以及g.fillPolygon(xpoints,ypoints,8);我应该能够用xpoints和ypoints创建一个Polygon,是否正确? – user3404854 2014-10-06 16:14:41

2

好的,不是试图找出多边形与按钮的关系,而是需要相当多的工作,并且会涉及到必须能够预先计算所需的空间量按钮和多边形将要求,这将是更简单的“作弊”,并利用适当的布局经理为你做的工作... ...

你也不应该依靠“魔术”的数字,应该依靠什么是在运行时实际已知的,例如作为组分

Poly

的实际宽度和高度10
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(); 
     } 

    } 

} 
+0

我意识到提供的坐标之一已关闭,所以我得到了多边形的形状。我尝试oj1.setLayout(new BoxLayout(oj1,BoxLayout。Y_AXIS));但为什么不这样做?是不是oj1的面板?你已经展示的是将按钮下方的形状居中的最简单方法?看起来很复杂,可以在几行内完成。 – user3404854 2014-10-06 22:28:47

+0

按照我的设置,“GridBagLayout”的默认行为是将组件居中。因此,如果我将“PolyPane”的首选大小更改为“200x200”,则它们将它们集中在一起,而无需执行任何额外的编码。 “BoxLayout”是另一个野兽...... – MadProgrammer 2014-10-06 22:44:04

+0

你能用下面的实现编辑你的例子吗?类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

相关问题