2014-10-05 88 views
2

对于编程类,我被要求创建一个iCalendar应用程序的副本。我使用JAVA来编写它,并使用JFrame和JPanel来绘制它。这里是我的问题的SSCCEE:如何将我的JButton移动到我的JPanel的右侧?

import java.awt.*; 

import javax.swing.*; 

public class Mainie extends JFrame { 
    private JButton back = new TriangleButton(true), 
      front = new TriangleButton(false); 
    public Mainie(){ 
     super(); 
     setSize(800, 400); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JPanel months = new JPanel(); 
     final JPanel days = new JPanel(); 
     JLabel one = new JLabel("Hallo"); 
     one.setHorizontalAlignment(JLabel.CENTER); 
     back.setHorizontalAlignment(SwingConstants.LEFT); 
     front.setHorizontalAlignment(SwingConstants.RIGHT); 
     months.setLayout(new BorderLayout()); 
     months.add(back, BorderLayout.WEST); 
     months.add(one, BorderLayout.CENTER); 
     months.add(front, BorderLayout.EAST); 

     days.setLayout(new GridLayout(1,1)); 
     days.add(new JButton("Meister Camickr")); 

     months.setAlignmentX(CENTER_ALIGNMENT); 
     add(months, BorderLayout.NORTH); 
     add(days, BorderLayout.CENTER); 

     setVisible(true); 
    } 

    public static void main(String[] args){ 
     new Mainie(); 
    } 
} 

class TriangleButton extends JButton { 
    private Shape triangle = createTriangle(); 

    public void paintBorder(Graphics g) { 
     ((Graphics2D) g).draw(triangle); 
    } 

    public void paintComponent(Graphics g) { 
     ((Graphics2D) g).fill(triangle); 
    } 

    public Dimension getPreferredSize() { 
     return new Dimension(200, 100); 
    } 

    public boolean contains(int x, int y) { 
     return triangle.contains(x, y); 
    } 

    public TriangleButton(boolean pointLeft) { 
     super(); 
     if (!pointLeft) 
      this.triangle = createRTriangle(); 
    } 

    private Shape createTriangle() { 
     Polygon p = new Polygon(); 
     p.addPoint(0, 20); 
     p.addPoint(20, 0); 
     p.addPoint(20, 40); 
     return p; 
    } 

    private Shape createRTriangle() { 
     Polygon p = new Polygon(); 
     p.addPoint(20, 20); 
     p.addPoint(0, 0); 
     p.addPoint(0, 40); 
     return p; 
    } 
} 

如果编译这个,你可以看到我的JButton太远左侧。我怎样才能把它移到正确的位置?

回答

3

这些按钮的基本问题是,按钮非常宽,并且可视指示符位于左侧。在他们周围放置一个边框,这变得很明显。

OTOH我会使用完全不同的方法,使用按钮和工厂方法的文本,使其看起来如预期。

enter image description hereenter image description here

import java.awt.*; 
import javax.swing.*; 

public class CustomPointerButtons { 

    JPanel ui; 

    CustomPointerButtons() { 
     initUI(); 
    } 

    private final void initUI() { 
     ui = new JPanel(new BorderLayout(4, 4)); 

     JPanel topPanel = new JPanel(new BorderLayout(4, 4)); 

     ui.add(topPanel, BorderLayout.PAGE_START); 
     ui.add(new JButton("Mister Mix")); //will default to CENTER 

     topPanel.add(new JLabel("Blah, Blah..")); 
     JButton back = getMinimalButton(new String(Character.toChars(9668))); 
     topPanel.add(back, BorderLayout.LINE_START); 

     JButton forward = getMinimalButton(new String(Character.toChars(9658))); 
     topPanel.add(forward, BorderLayout.LINE_END); 
    } 

    public JButton getMinimalButton(String text) { 
     JButton b = new JButton(text); 
     b.setFont(b.getFont().deriveFont(40f)); 

     b.setMargin(new Insets(0,0,0,0)); 
     b.setContentAreaFilled(false); 
     b.setBorder(null); 

     return b; 
    } 

    public final JComponent getUI() { 
     return ui; 
    } 


    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       JFrame f = new JFrame("Custom Pointer Buttons"); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setContentPane(new CustomPointerButtons().getUI()); 
       f.pack(); 
       f.setLocationByPlatform(true); 
       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

Danke!很棒 – 2014-10-05 06:08:42

0

的问题是你的随机首选大小并不代表三角形的实际大小。

你可以这样做:

public Dimension getPreferredSize() { 
//return new Dimension(200, 100); 
Rectangle bounds = triangle.getBounds(); 
return new Dimension(bounds.width, bounds.height); 
} 

您还有其他问题,因为你仍然有绘画文物。你应该总是调用super.paintComponent方法()当您覆盖的方法:

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    ((Graphics2D) g).fill(triangle); 
} 

但是,这仍然没有真正的工作,因为按钮做其他的绘画也是如此。所以真正的问题是你不应该试图做按钮的自定义绘画。你真正想做的是自定义绘画Icon。然后,您可以将图标添加到按钮。您可能想要查看Playing With Shapes。您可以使用ShapeIcon类来创建图标。这将提供更灵活的解决方案,因为我猜所有的形状都不是由ascii字符表示的。

相关问题