2017-08-19 48 views
1

我有以下按鈕:創建按鈕與圓形背景色的Java

JButton S1L1Reset = new JButton("Reset"); 
    S1L1Reset.setFont(new Font("Work Sans", Font.PLAIN, 14)); 
    S1L1Reset.setForeground(new Color(90, 90, 90)); 
    S1L1Reset.setBackground(new Color(220, 208, 192)); 
    S1L1Reset.setOpaque(true); 

我想爲按鈕是圓的,而不是盒裝。我發現另一篇文章創建了一個類,它可以使下面顯示的按鈕的邊框變圓。

class RoundedBorder implements Border { 

    private int radius; 

    RoundedBorder(int radius) { 
     this.radius = radius; 
    } 

    public Insets getBorderInsets(Component c) { 
     return new Insets(this.radius+1, this.radius+1, this.radius+2, this.radius); 
    } 

    public boolean isBorderOpaque() { 
     return true; 
    } 

    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 
     g.drawRoundRect(x, y, width-1, height-1, radius, radius); 
    } 
} 

當我做了更改按鈕,利用這個類,我得到了下面的代碼:

JButton S1L1Reset = new JButton("Reset"); 
    S1L1Reset.setFont(new Font("Work Sans", Font.PLAIN, 14)); 
    S1L1Reset.setForeground(new Color(90, 90, 90)); 
    S1L1Reset.setBackground(new Color(220, 208, 192)); 
    S1L1Reset.setOpaque(true); 
    S1L1Reset.setBorderPainted(false); 
    S1L1Reset.setBorder(new RoundedBorder(20)); //new line of code added 

代碼然而創建一個按鈕,看起來像下面這樣:Button。有沒有什麼辦法可以讓按鈕的格式設置爲背景色也保留在圓形邊框內。

整個代碼:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.Vector; 

import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JMenuBar; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.UIManager; 
import javax.swing.plaf.basic.BasicButtonUI; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.JMenu; 
import javax.swing.JTabbedPane; 
import javax.swing.JTable; 

import java.awt.CardLayout; 
import javax.swing.JLabel; 
import javax.swing.SwingConstants; 
import java.awt.Font; 
import java.awt.Graphics; 
@SuppressWarnings("rawtypes") 
public class TestEnvironment { 

JFrame TestEnvironmentWindow; 

Vector data1 = new Vector(100); 
Vector data2 = new Vector(100); 
Vector data3 = new Vector(100); 
JTable S1L1; 
JTable S1L2; 
JTable S1L3; 

private DefaultTableModel dataModel1; 
private DefaultTableModel dataModel2; 
private DefaultTableModel dataModel3; 

public static void main(String[] args) { 

    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       TestEnvironment window = new TestEnvironment(); 
       window.TestEnvironmentWindow.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public TestEnvironment() { 
    initialize(); 
} 

private void initialize() { 

    TestEnvironmentWindow = new JFrame(); 
    TestEnvironmentWindow.getContentPane().setLayout(null); 
    TestEnvironmentWindow.setResizable(false); 
    TestEnvironmentWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    TestEnvironmentWindow.setTitle("Statistics Tool Kit"); 
    TestEnvironmentWindow.setIconImage(null); 
    TestEnvironmentWindow.setSize(new Dimension(1000, 650)); 

// Content Section 

    final TableModel dataModel = new AbstractTableModel() { 

     public int getColumnCount(){ 
      return 5; 
     } 

     public int getRowCount(){ 
      return 10; 
     } 

     public Object getValueAt(int row, int col){ 
      return new Integer(row*col); 
     } 

     public boolean isCellEditable(int row, int col){ 
      return true; 
     } 
    }; 

    JPanel Content = new JPanel(); 
    Content.setBounds(175, 0, 825, 605); 
    TestEnvironmentWindow.getContentPane().add(Content); 
    Content.setBackground(new Color(244,244,244)); 
    Content.setLayout(new CardLayout(0, 0)); 

    JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); 
    Content.add(tabbedPane); 
    JPanel set1Panel = new JPanel(); 
    set1Panel.setLayout(null); 

    Vector<String> columnNames = new Vector<String>(2); 
    columnNames.addElement("X-Values"); 
    columnNames.addElement("Y-Values"); 

    S1L1 = new JTable(data1, columnNames); 
    S1L1.setFont(new Font("Work Sans", Font.PLAIN, 12)); 
    S1L1.setGridColor(new Color(150,150,150)); 
    JScrollPane S1L1Scroll = new JScrollPane(S1L1,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    S1L1Scroll.getVerticalScrollBar().setPreferredSize (new Dimension(0,0)); 
    dataModel1 = new DefaultTableModel(data1, columnNames); 
    S1L1.setModel(dataModel1); 
    S1L1Scroll.setBounds(38, 50, 225, 400); 
    set1Panel.add(S1L1Scroll); 

    S1L2 = new JTable(data2, columnNames); 
    S1L2.setFont(new Font("Work Sans", Font.PLAIN, 12)); 
    S1L2.setGridColor(new Color(150,150,150)); 
    JScrollPane S1L2Scroll = new JScrollPane(S1L2,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    S1L2Scroll.getVerticalScrollBar().setPreferredSize (new Dimension(0,0)); 
    dataModel2 = new DefaultTableModel(data2, columnNames); 
    S1L2.setModel(dataModel2); 
    S1L2Scroll.setBounds(288, 50, 225, 400); 
    set1Panel.add(S1L2Scroll); 

    S1L3 = new JTable(data3, columnNames); 
    S1L3.setFont(new Font("Work Sans", Font.PLAIN, 12)); 
    S1L3.setGridColor(new Color(150,150,150)); 
    JScrollPane S1L3Scroll = new JScrollPane(S1L3,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    S1L3Scroll.getVerticalScrollBar().setPreferredSize (new Dimension(0,0)); 
    dataModel3 = new DefaultTableModel(data3, columnNames); 
    S1L3.setModel(dataModel3); 
    S1L3Scroll.setBounds(538, 50, 225, 400); 
    set1Panel.add(S1L3Scroll); 

    JLabel ListOneLabel = new JLabel("List 1"); 
    ListOneLabel.setFont(new Font("Work Sans", Font.PLAIN, 16)); 
    ListOneLabel.setHorizontalAlignment(SwingConstants.CENTER); 
    ListOneLabel.setBackground(new Color(220, 208, 192)); 
    ListOneLabel.setOpaque(true); 
    ListOneLabel.setBounds(77, 20, 150, 20); 
    set1Panel.add(ListOneLabel); 

    JLabel ListTwoLabel = new JLabel("List 2"); 
    ListTwoLabel.setFont(new Font("Work Sans", Font.PLAIN, 16)); 
    ListTwoLabel.setHorizontalAlignment(SwingConstants.CENTER); 
    ListTwoLabel.setBackground(new Color(220, 208, 192)); 
    ListTwoLabel.setOpaque(true); 
    ListTwoLabel.setBounds(327, 20, 150, 20); 
    set1Panel.add(ListTwoLabel); 

    JLabel ListThreeLabel = new JLabel("List 3"); 
    ListThreeLabel.setFont(new Font("Work Sans", Font.PLAIN, 16)); 
    ListThreeLabel.setHorizontalAlignment(SwingConstants.CENTER); 
    ListThreeLabel.setBackground(new Color(220, 208, 192)); 
    ListThreeLabel.setOpaque(true); 
    ListThreeLabel.setBounds(577, 20, 150, 20); 
    set1Panel.add(ListThreeLabel); 

    JButton S1L1Reset = new JButton("Reset"); 
    S1L1Reset.setFont(new Font("Work Sans", Font.PLAIN, 14)); 
    S1L1Reset.setForeground(new Color(90, 90, 90)); 
    S1L1Reset.setBackground(new Color(220, 208, 192)); 
    S1L1Reset.setOpaque(true); 
    S1L1Reset.setBorderPainted(false); 
    S1L1Reset.setBorder(new RoundedBorder(20)); 
    S1L1Reset.setBounds(43, 465, 100, 20); 
    set1Panel.add(S1L1Reset); 
    S1L1Reset.addMouseListener(new MouseAdapter() { 
     public void mouseEntered(MouseEvent e) { 
      S1L1Reset.setForeground(new Color(0,0,0)); 

     } 
     public void mouseExited(MouseEvent e) { 
      S1L1Reset.setForeground(new Color(90,90,90)); 
     } 
    }); 
    S1L1Reset.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      deleteAllRows(dataModel1); 
     } 
    }); 
    S1L1Reset.setUI(new BasicButtonUI() { 
     public void update(Graphics g, JComponent c) { 
      if (c.isOpaque()) { 
       Color fillColor = c.getBackground(); 
       g.setColor(fillColor); 
       g.fillRoundRect(0, 0, c.getWidth(),c.getHeight(), 20, 20); 
      } 
      paint(g, c); 
     } 
    }); 

    JButton S1L2Reset = new JButton("Reset"); 
    S1L2Reset.setFont(new Font("Work Sans", Font.PLAIN, 14)); 
    S1L2Reset.setForeground(new Color(90, 90, 90)); 
    S1L2Reset.setBackground(new Color(220, 208, 192)); 
    S1L2Reset.setOpaque(true); 
    S1L2Reset.setBorderPainted(false); 
    S1L2Reset.setBorder(new RoundedBorder(20)); 
    S1L2Reset.setBounds(293, 465, 100, 20); 
    set1Panel.add(S1L2Reset); 
    S1L2Reset.addMouseListener(new MouseAdapter() { 
     public void mouseEntered(MouseEvent e) { 
      S1L2Reset.setForeground(new Color(0,0,0)); 
     } 
     public void mouseExited(MouseEvent e) { 
      S1L2Reset.setForeground(new Color(90,90,90)); 
     } 
    }); 
    S1L2Reset.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      deleteAllRows(dataModel2); 
     } 
    }); 
    S1L2Reset.setUI(new BasicButtonUI() { 
     public void update(Graphics g, JComponent c) { 
      if (c.isOpaque()) { 
       g.setColor(c.getBackground()); 
       g.fillRoundRect(0, 0, c.getWidth(),c.getHeight(), 20, 20); 
      } 
      paint(g, c); 
     } 
    }); 

    JButton S1L3Reset = new JButton("Reset"); 
    S1L3Reset.setFont(new Font("Work Sans", Font.PLAIN, 14)); 
    S1L3Reset.setForeground(new Color(90, 90, 90)); 
    S1L3Reset.setBackground(new Color(220, 208, 192)); 
    S1L3Reset.setOpaque(true); 
    S1L3Reset.setBorderPainted(false); 
    S1L3Reset.setBorder(new RoundedBorder(20)); 
    S1L3Reset.setBounds(543, 465, 100, 20); 
    set1Panel.add(S1L3Reset); 
    S1L3Reset.addMouseListener(new MouseAdapter() { 
     public void mouseEntered(MouseEvent e) { 
      S1L3Reset.setForeground(new Color(0,0,0)); 
     } 
     public void mouseExited(MouseEvent e) { 
      S1L3Reset.setForeground(new Color(90,90,90)); 
     } 
    }); 
    S1L3Reset.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

     } 
    }); 
    S1L3Reset.setUI(new BasicButtonUI() { 
     public void update(Graphics g, JComponent c) { 
      if (c.isOpaque()) { 
       g.setColor(c.getBackground()); 
       g.fillRoundRect(0, 0, c.getWidth(),c.getHeight(), 20, 20); 
      } 
      paint(g, c); 
     } 
    }); 

    JButton S1L1Save = new JButton("Save"); 
    S1L1Save.setFont(new Font("Work Sans", Font.PLAIN, 14)); 
    S1L1Save.setForeground(new Color(90, 90, 90)); 
    S1L1Save.setBackground(new Color(220, 208, 192)); 
    S1L1Save.setOpaque(true); 
    S1L1Save.setBorderPainted(false); 
    S1L1Save.setBorder(new RoundedBorder(20)); 
    S1L1Save.setBounds(155, 465, 100, 20); 
    set1Panel.add(S1L1Save); 
    S1L1Save.addMouseListener(new MouseAdapter() { 
     public void mouseEntered(MouseEvent e) { 
      S1L1Save.setForeground(new Color(0,0,0)); 
     } 
     public void mouseExited(MouseEvent e) { 
      S1L1Save.setForeground(new Color(90,90,90)); 
     } 
    }); 
    S1L1Save.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

     } 
    }); 
    S1L1Save.setUI(new BasicButtonUI() { 
     public void update(Graphics g, JComponent c) { 
      if (c.isOpaque()) { 
       g.setColor(c.getBackground()); 
       g.fillRoundRect(0, 0, c.getWidth(),c.getHeight(), 20, 20); 
      } 
      paint(g, c); 
     } 
    }); 

    JButton S1L2Save = new JButton("Save"); 
    S1L2Save.setFont(new Font("Work Sans", Font.PLAIN, 14)); 
    S1L2Save.setForeground(new Color(90, 90, 90)); 
    S1L2Save.setBackground(new Color(220, 208, 192)); 
    S1L2Save.setOpaque(true); 
    S1L2Save.setBorderPainted(false); 
    S1L2Save.setBorder(new RoundedBorder(20)); 
    S1L2Save.setBounds(405, 465, 100, 20); 
    set1Panel.add(S1L2Save); 
    S1L2Save.addMouseListener(new MouseAdapter() { 
     public void mouseEntered(MouseEvent e) { 
      S1L2Save.setForeground(new Color(0,0,0)); 
     } 
     public void mouseExited(MouseEvent e) { 
      S1L2Save.setForeground(new Color(90,90,90)); 
     } 
    }); 
    S1L2Save.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

     } 
    }); 
    S1L2Save.setUI(new BasicButtonUI() { 
     public void update(Graphics g, JComponent c) { 
      if (c.isOpaque()) { 
       g.setColor(c.getBackground()); 
       g.fillRoundRect(0, 0, c.getWidth(),c.getHeight(), 20, 20); 
      } 
      paint(g, c); 
     } 
    }); 

    JButton S1L3Save = new JButton("Save"); 
    S1L3Save.setFont(new Font("Work Sans", Font.PLAIN, 14)); 
    S1L3Save.setForeground(new Color(90, 90, 90)); 
    S1L3Save.setBackground(new Color(220, 208, 192)); 
    S1L3Save.setOpaque(true); 
    S1L3Save.setBorderPainted(false); 
    S1L3Save.setBorder(new RoundedBorder(20)); 
    S1L3Save.setBounds(655, 465, 100, 20); 
    set1Panel.add(S1L3Save); 
    S1L3Save.addMouseListener(new MouseAdapter() { 
     public void mouseEntered(MouseEvent e) { 
      S1L3Save.setForeground(new Color(0,0,0)); 
     } 
     public void mouseExited(MouseEvent e) { 
      S1L3Save.setForeground(new Color(90,90,90)); 
     } 
    }); 
    S1L3Save.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

     } 
    });  
    S1L3Save.setUI(new BasicButtonUI() { 
     public void update(Graphics g, JComponent c) { 
      if (c.isOpaque()) { 
       g.setColor(c.getBackground()); 
       g.fillRoundRect(0, 0, c.getWidth(),c.getHeight(), 20, 20); 
      } 
      paint(g, c); 
     } 
    }); 

    JButton ClearAll = new JButton("Clear All"); 
    ClearAll.setFont(new Font("Work Sans", Font.PLAIN, 14)); 
    ClearAll.setForeground(new Color(90, 90, 90)); 
    ClearAll.setBackground(new Color(220, 208, 192)); 
    ClearAll.setOpaque(true); 
    ClearAll.setBorderPainted(false); 
    ClearAll.setBorder(new RoundedBorder(20)); 
    ClearAll.setBounds(238, 515, 150, 25); 
    set1Panel.add(ClearAll); 
    ClearAll.addMouseListener(new MouseAdapter() { 
     public void mouseEntered(MouseEvent e) { 
      ClearAll.setForeground(new Color(0,0,0)); 
     } 
     public void mouseExited(MouseEvent e) { 
      ClearAll.setForeground(new Color(90,90,90)); 
     } 
    }); 
    ClearAll.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

     } 
    }); 
    ClearAll.setUI(new BasicButtonUI() { 
     public void update(Graphics g, JComponent c) { 
      if (c.isOpaque()) { 
       g.setColor(c.getBackground()); 
       g.fillRoundRect(0, 0, c.getWidth(),c.getHeight(), 20, 20); 
      } 
      paint(g, c); 
     } 
    }); 

    JButton SaveAll = new JButton("Save All"); 
    SaveAll.setFont(new Font("Work Sans", Font.PLAIN, 14)); 
    SaveAll.setForeground(new Color(90, 90, 90)); 
    SaveAll.setBackground(new Color(220, 208, 192)); 
    SaveAll.setOpaque(true); 
    SaveAll.setBorderPainted(false); 
    SaveAll.setBorder(new RoundedBorder(20)); 
    SaveAll.setBounds(410, 515, 150, 25); 
    set1Panel.add(SaveAll); 
    SaveAll.addMouseListener(new MouseAdapter() { 
     public void mouseEntered(MouseEvent e) { 
      SaveAll.setForeground(new Color(0,0,0)); 
     } 
     public void mouseExited(MouseEvent e) { 
      SaveAll.setForeground(new Color(90,90,90)); 
     } 
    }); 
    SaveAll.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

     } 
    }); 
    SaveAll.setUI(new BasicButtonUI() { 
     public void update(Graphics g, JComponent c) { 
      if (c.isOpaque()) { 
       g.setColor(c.getBackground()); 
       g.fillRoundRect(0, 0, c.getWidth(),c.getHeight(), 20, 20); 
      } 
      paint(g, c); 
     } 
    }); 

    tabbedPane.add(set1Panel); 

// Menu Bar Section 
    JPanel MenuBar = new JPanel(); 
    MenuBar.setBackground(new Color(220, 208, 192)); 
    MenuBar.setBounds(0, 0, 175, 605); 
    TestEnvironmentWindow.getContentPane().add(MenuBar); 
    MenuBar.setLayout(null); 

// Menu Bar Section  
    JMenuBar menuBar = new JMenuBar(); 
    TestEnvironmentWindow.setJMenuBar(menuBar); 

    JMenu mnFile = new JMenu("File"); 
    menuBar.add(mnFile); 

    JMenu mnEdit = new JMenu("Edit"); 
    menuBar.add(mnEdit); 

    JMenu mnSearch = new JMenu("Search"); 
    menuBar.add(mnSearch); 

    JMenu mnWindow = new JMenu("Window"); 
    menuBar.add(mnWindow); 

    JMenu mnHelp = new JMenu("Help"); 
    menuBar.add(mnHelp); 
} 

public static void deleteAllRows(final DefaultTableModel model) { 
    for(int i = model.getRowCount() - 1; i >= 0; i--) { 
     model.removeRow(i); 
    } 
} 
} 
+0

所以你想要的邊緣是圓的? –

回答

2

Swing組件使用UI委託自行繪製,背景畫是在基類ComponentUI做過這樣的:

public void update(Graphics g, JComponent c) { 
    if (c.isOpaque()) { 
     g.setColor(c.getBackground()); 
     g.fillRect(0, 0, c.getWidth(),c.getHeight()); 
    } 
    paint(g, c); 
} 

正如你可以看到它使用fillRect,所以它必須以矩形填充背景。要改變它,創造BasicButtonUI的一個子類(其子類是各種樣子&感覺的UI代表),並通過填寫圓矩形,而不是覆蓋此方法:

S1L1Reset.setUI(new BasicButtonUI() { 
     @Override 
     public void update(Graphics g, JComponent c) { 
      if (c.isOpaque()) { 
       Color fillColor = c.getBackground(); 

       AbstractButton button = (AbstractButton) c; 
       ButtonModel model = button.getModel(); 

       if (model.isPressed()) { 
        fillColor = fillColor.darker(); 
       } else if (model.isRollover()) { 
        fillColor = fillColor.brighter(); 
       } 

       g.setColor(fillColor); 
       g.fillRoundRect(0, 0, c.getWidth(),c.getHeight(), 20, 20); 
      } 
      paint(g, c); 
     } 
    }); 

正如你可以在代碼中看到,你需要來處理按鈕的各種狀態,如鼠標按下的背景,因爲這些都是在BasicButtonUI子類中完成的,因爲您不再使用這些子類,您必須自己實現所有這些。你可以參考MetalButtonUI中的一個例子,說明按鈕在不同的狀態下如何在不同的狀態下繪製自己的感覺。

也許不需要調用setBorderPainted(false)?如果你真的想要利用圓形邊框,你應該需要它被畫。

The round button in action!

+0

我如何設置按鈕的各種狀態,如您所說。我爲這個按鈕設置了一個MouseListener和一個ActionListener。在鼠標監聽器中,我設置了mouseEntered和mouseExited。我會從這裏做什麼。同樣非常感謝你的幫助。 –

+1

您好Mathew,你不需要自己添加鼠標監聽器(在我最初的答案中,我說你需要自己添加監聽器,但很快我記得它不是必需的,超類爲你做了這個),你只需要檢查按鈕模型中的狀態並根據感興趣的狀態進行繪製。我已經更新了我的答案,以說明它是如何完成的(使用更亮/更黑只是一個示例,您可以將它們更改爲任意顏色)。 –

+0

每當我將鼠標放在按鈕上時,它就會回到正方形。如果我將鼠標從按鈕上移開,它仍然是方形的。當我離開GUI窗口並打開其他東西,比如谷歌瀏覽器並返回到GUI窗口時,這些按鈕重置爲圓形。爲什麼會這樣? –