2016-07-22 12 views
2

私はレイアウトをしています。私は一緒に一杯になりたいボタンのペアを持っています。私はこれを達成するためにいくつかの方法を考えることができますが、良い方法があるかどうかは疑問です。JButtonをスイングさせるにはどうしたらいいですか?

package helloworld; 

import javax.swing.BoxLayout; 
import javax.swing.Box; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.EventQueue; 
/** 
* Created by matt on 22/07/16. 
*/ 
public class FlushButtons { 

    private void showGui(){ 
     JFrame frame = new JFrame(); 

     JPanel panel = new JPanel(); 
     JButton plus = new JButton("+"); 
     JButton minus = new JButton("-"); 

     panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); 
     panel.add(plus); 
     panel.add(minus); 

     frame.setContentPane(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    public static void main(String[] args){ 

     EventQueue.invokeLater(()->{ 
      new FlushButtons().showGui(); 
     }); 

    } 
} 

左の画像を生成するが、私はそれがより右の画像のようになりたいと思います:ここで

は、いくつかのテンプレートコードです。 default layoutdesired layout

JButton#setMarginを使ってみましたが、何の効果もありませんでした。私は希望の結果を得ることができるJButton#setPreferredSizeを使用しましたが、私はあらかじめボタンのサイズを知る必要があります。

+0

代わりに、ボックスのレイアウトのフローレイアウトを試みることができます。正に言えば、組み込みのレイアウトマネージャのほとんどは、使いやすく組み合わせが難しいので、サードパーティ製のレイアウトマネージャの1つを見てみたいと思うかもしれません。 [MigLayout](http://www.miglayout.com/)。 – Thomas

+0

@トーマス私はそれがレイアウトマネージャーだとは思わない、それはもっとボタンそのものだ。好みのサイズを設定すると、大丈夫です。私はちょうど手前の寸法を知る必要があります。 – matt

+0

私は自分のPCで試していましたが、あなたのコードはWindows上で(それは醜いので)私にそれを与えてくれました:https://puu.sh/qalTs/b42c6158f6.png いいえ、このようにいいですね? – Kapcash

答えて

3

ここは私の解決策です。

enter image description here

import java.awt.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class FlushButtons { 

    private JComponent ui = null; 

    FlushButtons() { 
     initUI(); 
    } 

    private JButton getFlushButton(String text) { 
     JButton b = new JButton(); 

     b.setBorderPainted(false); 
     b.setContentAreaFilled(false); 
     b.setMargin(new Insets(0,0,0,0)); 
     b.setBorder(null); 
     b.setIcon(new ImageIcon(getImageOfText(text, Color.GREEN.darker()))); 
     b.setRolloverIcon(new ImageIcon(getImageOfText(text, Color.ORANGE))); 
     b.setPressedIcon(new ImageIcon(getImageOfText(text, Color.RED))); 

     return b; 
    } 

    private BufferedImage getImageOfText(String text, Color color) { 
     int s = 24; 
     BufferedImage bi = new BufferedImage(s, s, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g = bi.createGraphics(); 

     g.setColor(color); 
     g.fillRect(0, 0, s, s); 
     g.setColor(Color.BLACK); 
     g.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 16)); 
     // use better ways to position text.. 
     g.drawString(text, 8, 16); 

     g.dispose(); 
     return bi; 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0)); 
     ui.setBorder(new EmptyBorder(4,4,4,4)); 

     ui.add(getFlushButton("+")); 
     ui.add(getFlushButton("-")); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       FlushButtons o = new FlushButtons(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
0

私の解決策は、ちょっとばかげているようです。

JPanel panel = new JPanel(); 

    JButton plus = new JButton("+"); 
    JButton minus = new JButton("-"); 

    plus.setPreferredSize(new Dimension(29, 29)); 
    plus.setMaximumSize(new Dimension(33, 33)); 
    minus.setPreferredSize(new Dimension(29, 29)); 
    minus.setMaximumSize(new Dimension(33, 33)); 


    panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); 

    panel.add(plus); 
    panel.add(minus); 
    panel.add(Box.createVerticalStrut(33)); 
    panel.add(Box.createHorizontalGlue()); 

垂直のストラットがなければ、ボタンは枠なしでパックされます。

ハッキングの何か、より良いものを聞くことを望みます。

関連する問題