2014-10-06 174 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

相關問題