2015-11-21 4 views
4

У меня есть JButton, который я хочу установить фон в цвет.Установить цвет фона JButton на окнах

JButton button = new JButton(); 
button.setVisible(true); 
button.setPreferredSize(new Dimension(student_scroll.getWidth(), 50)); 
button.setBorder(BorderFactory.createLineBorder(Color.WHITE, 1)); 
button.setBackground(Color.BLACK); 
button.setForeground(Color.WHITE); 
button.setOpaque(true); 

Я использовал это для mac, и оно появилось так, как я хотел. Тем не менее, при попытке сделать это на окнах, передний план белый (как следует), но фон пуст.

Setting background color to JButton

говорит, чтобы добавить button.setContentAreaFilled(false);, который я сделал, но не имел никакого эффекта. Большинство других утверждают, что добавили button.setOpaque(true);, которые я тоже сделал.

Что еще мне нужно сделать, чтобы оно отображалось на черном фоне?

EDIT

В соответствии с просьбой SSCCE:

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class MainSwing extends JFrame { 
    private static final long serialVersionUID = -8231889836024827530L; 

    public static void main(String[] args) { 
     try { 
      System.setProperty("apple.laf.useScreenMenuBar", "true"); 
      System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Test"); 
      UIManager.put("ScrollBarUI", "main.CustomScrollBarUI"); 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } 
    catch(ClassNotFoundException e) { 
      System.out.println("ClassNotFoundException: " + e.getMessage()); 
    } 
    catch(InstantiationException e) { 
      System.out.println("InstantiationException: " + e.getMessage()); 
    } 
    catch(IllegalAccessException e) { 
      System.out.println("IllegalAccessException: " + e.getMessage()); 
    } 
    catch(UnsupportedLookAndFeelException e) { 
      System.out.println("UnsupportedLookAndFeelException: " + e.getMessage()); 
    } 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame() { 

        Container c = getContentPane(); 
        JButton button = new JButton("Hello"); 
        { 
         button.setText("Hello"); 
         button.setVisible(true); 
         button.setPreferredSize(new Dimension(100, 50)); 
         button.setBorder(BorderFactory.createLineBorder(Color.WHITE, 1)); 
         button.setBackground(Color.BLACK); 
         button.setForeground(Color.WHITE); 
         button.setOpaque(true); 
         c.add(button); 
        } 

       }; 
       frame.setSize(500, 500); 
       frame.setBackground(Color.BLACK); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

кажется, что проблема имеет что-то делать с линией: UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); как когда я удалить его, кнопки черные.

+0

отлично работает для меня. Отправьте надлежащий [SSCCE] (http://sscce.org/), который демонстрирует проблему. Так что все, что вам нужно, это кадр с кнопкой, чтобы выполнить свой тест. Вся программа будет составлять 10-15 строк кода. – camickr

+1

'setContentAreaFilled (false)' и или 'setBorderPainted (false)'. Эффект «заливки» предоставляется делегатом внешнего вида и я не знаю, как использовать цвета, которые он использует – MadProgrammer

+0

'button.setVisible (true);' не нужно. Просто добавьте его (к контейнеру, возможно, добавленному) в окно верхнего уровня (кадр, окно, диалог и т. Д.), Который сам упаковывается после добавления компонентов, а затем устанавливает видимость. 'button.setPreferredSize (новое измерение (student_scroll.getWidth(), 50));' Если кнопка не имеет текста, размер легко устанавливается с использованием (возможно, прозрачного) изображения. Если кнопка ** имеет текст **, размер лучше определяется размером текста текста муравья, а также полями и границами кнопки, которая содержит его.В любом случае нам не нужно ** устанавливать ** предпочтительный размер. –

ответ

4

Я угадываю из этих пар ключей/значений, что PLAF - это OSA на основе OS X PLAF. И это, кажется, является частью проблемы здесь. Здесь это без области содержимого, заполненной на Windows.

enter image description here

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

public class MainSwing extends JFrame { 

    public static void main(String[] args) { 
     try { 
      System.setProperty("apple.laf.useScreenMenuBar", "true"); 
      System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Test"); 
      UIManager.put("ScrollBarUI", "main.CustomScrollBarUI"); 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) { 
      e.printStackTrace(); // more info for less LOC! 
     } 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame() { 

        Container c = getContentPane(); 
        JButton button = new JButton("Hello"); 

        { 
         c.setLayout(new GridLayout(0,1)); 
         c.add(new JButton("Hi")); 
         button.setText(UIManager.getSystemLookAndFeelClassName()); 
         button.setVisible(true); 
         button.setPreferredSize(new Dimension(400, 100)); 
         button.setBorder(BorderFactory.createLineBorder(Color.WHITE, 1)); 
         button.setContentAreaFilled(false); 
         button.setBackground(Color.BLACK); 
         button.setForeground(Color.WHITE); 
         button.setOpaque(true); 
         c.add(button); 
        } 
       }; 
       frame.pack(); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+3

(1+), это также работает для меня в Windows. Я выяснил, что оператор 'setOpaque (true)' важен и должен быть вызван после 'setContentAreaFilled (false)', поскольку этот оператор, по-видимому, вызывает 'setOpaque (false)', о котором я не знал. Учитесь чему-то каждый день. Думаю, я должен был сначала прочитать ваш ответ в «Установка цвета фона на кнопку» :) – camickr

+0

@camickr Всегда анализ мудрецов. :) Я также видел значение для бокового шага всей «проблемы» PLAF, как это было предложено в вашем ответе. –

+0

Назад из будущего, это также решает ту же проблему с Jython JButtons. –

3

кажется, что проблема имеет что-то делать с линией: UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName()); как при удалении, кнопки черные.

Так что это дополнительная информация, которую у нас не было до создания SSCCE (поэтому вы всегда должны публиковать вопрос SSCCE с вашим вопросом).

Это также говорит о том, что проблема связана не с вашим кодом, а с LAF. Windows LAF игнорирует метод setBackground (...) и рисует собственный фон.

Одним из вариантов было бы добавить значок на кнопку нужного цвета. Затем вы можете настроить текст, который будет окрашиваться в центре кнопки:

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

public class ColorIcon implements Icon 
{ 
    private Color color; 
    private int width; 
    private int height; 

    public ColorIcon(Color color, int width, int height) 
    { 
     this.color = color; 
     this.width = width; 
     this.height = height; 
    } 

    public int getIconWidth() 
    { 
     return width; 
    } 

    public int getIconHeight() 
    { 
     return height; 
    } 

    public void paintIcon(Component c, Graphics g, int x, int y) 
    { 
     g.setColor(color); 
     g.fillRect(x, y, width, height); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    public static void createAndShowGUI() 
    { 
     JPanel panel = new JPanel(new GridLayout(2, 2)); 

     for (int i = 0; i < 4; i++) 
     { 
      Icon icon = new ColorIcon(Color.RED, 50, 50); 
      JButton label = new JButton(icon); 
      label.setText("" + i); 
      label.setHorizontalTextPosition(JButton.CENTER); 
      label.setVerticalTextPosition(JButton.CENTER); 
      panel.add(label); 
     } 

     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.getContentPane().add(panel); 
     f.setSize(200, 200); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 

Затем следует работать со всеми ЛАФ.

Смежные вопросы