【问题标题】:Adding color to JLabel next to my JSliders在我的 JSlider 旁边为 JLabel 添加颜色
【发布时间】:2015-11-19 22:30:49
【问题描述】:

想要在我的 JLabel 中将红色、绿色、蓝色的文本颜色更改为适当的颜色,同时保持我的背景和 JSlider 仍然是程序的默认颜色。我不关心高度和宽度颜色,而只关心表示红色、蓝色和绿色的 JSlider 旁边的文本。任何帮助表示赞赏!谢谢!

import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import javax.swing.event.*;
public class ControlApp extends JFrame
{
    private JPanel mainPanel;
    private PrintWriter out;
    private JSlider height,width,red,green,blue;
    private String aspect;
    private String value;

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

public ControlApp()
{
    super("ControlApp");
    mainPanel = new JPanel();
    add(mainPanel,BorderLayout.CENTER);

    //SliderListener sl = new SliderListener();

    height = new JSlider(JSlider.VERTICAL, 0,500,0);
    //height.addChangeListener(sl);
    width = new JSlider(JSlider.VERTICAL, 0,500,0);
    //width.addChangeListener(sl);
    red = new JSlider(JSlider.VERTICAL, 0,255,0);
    //red.addChangeListener(sl);       
    green = new JSlider(JSlider.VERTICAL, 0,255,0);
    //green.addChangeListener(sl);
    blue = new JSlider(JSlider.VERTICAL, 0,255,0);
    //blue.addChangeListener(sl);

    mainPanel.add(new JLabel("Height"));
    mainPanel.add(height,BorderLayout.CENTER);
    mainPanel.add(new JLabel("Width"));
    mainPanel.add(width,BorderLayout.CENTER);
    mainPanel.add(new JLabel("Red"));
    mainPanel.add(red,BorderLayout.CENTER);
    mainPanel.add(new JLabel("Green"));
    mainPanel.add(green,BorderLayout.CENTER);
    mainPanel.add(new JLabel("Blue"));
    mainPanel.add(blue,BorderLayout.CENTER);

    setLocationRelativeTo(null);
    this.setSize(500,250);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
}
}

【问题讨论】:

  • 这不是我要问的。 ChangeListener 将一个套接字传递给另一个类以更改 JFrame 的背景。我希望能够在我的 JLabel 中更改文本的颜色(红、绿、蓝)。
  • @HovercraftFullOfEels
  • 好吧,我的错——只是设置它们的前景色。但是,为什么在向使用 FlowLayout 的 JPanel 添加组件时(错误)使用 BorderLayout 常量?

标签: java swing colors jslider


【解决方案1】:

当添加到默认使用 FlowLayout 的 JPanel 时,您不应该使用 BorderLayout 常量。事实上,我建议您使用完全不同的布局,即 GridLayout,以便所有列整齐地排列在一起。另一种选择是在您的 JSlider 周围使用 TitledBorder,例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.util.EnumMap;
import java.util.Map;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.event.*;

public class ControlPanel extends JPanel {
    private static final int GAP = 3;
    private Map<Control, JSlider> sliderMap = new EnumMap<>(Control.class);

    public ControlPanel() {
        setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        setLayout(new GridLayout(1, 0, GAP, GAP));
        for (Control control : Control.values()) {
            JSlider slider = new JSlider(JSlider.VERTICAL, 0, control.getMaxValue(), 0);
            slider.setPaintLabels(true);
            slider.setPaintTicks(true);
            slider.setPaintTrack(true);
            slider.setMajorTickSpacing(100);
            slider.setMinorTickSpacing(20);
            slider.addChangeListener(new SliderListener(control));
            sliderMap.put(control, slider);
            JPanel panel = new JPanel(new BorderLayout());
            TitledBorder titleBorder = BorderFactory.createTitledBorder(control.getText());
            titleBorder.setTitleColor(control.getColor());
            panel.setBorder(titleBorder);
            panel.add(slider);
            add(panel);            
        }
    }

    private class SliderListener implements ChangeListener {
        private Control control;

        public SliderListener(Control control) {
            this.control = control;
        }

        @Override
        public void stateChanged(ChangeEvent e) {
            JSlider slider = (JSlider) e.getSource();
            int value = slider.getValue();            
            System.out.printf("Control: %s, Value: %d%n", control, value);
        }

    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("Control Panel");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new ControlPanel());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

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

public enum Control {
    HEIGHT("Height", 500, Color.BLACK), WIDTH("Width", 500, Color.black), RED("Red", 255, Color.RED), 
    GREEN("Green", 255, Color.GREEN), BLUE("Blue", 255, Color.BLUE);

    private String text;
    private int maxValue;
    private Color color;

    private Control(String text, int maxValue, Color color) {
        this.text = text;
        this.maxValue = maxValue;
        this.color = color;
    }

    public String getText() {
        return text;
    }

    public int getMaxValue() {
        return maxValue;
    }

    public Color getColor() {
        return color;
    }

}

显示为:

【讨论】:

  • 感谢您的输入,现在我知道何时使用哪种布局了! @HovercraftFullOfEels
【解决方案2】:

ttrigger10 -

您想在这些 JLabel 上设置前景色,以使用 setForgroundColor 方法将它们设置为特定颜色。请参阅下面的修改代码以更改颜色:

    JLabel redLabel, blueLabel, greenLabel;
    redLabel = new JLabel("Red");
    redLabel.setForeground(Color.RED);
    greenLabel = new JLabel("Green");
    greenLabel.setForeground(Color.GREEN);
    blueLabel = new JLabel("Blue");
    blueLabel.setForeground(Color.BLUE);

    mainPanel.add(new JLabel("Height"));
    mainPanel.add(height, BorderLayout.CENTER);
    mainPanel.add(new JLabel("Width"));
    mainPanel.add(width, BorderLayout.CENTER);
    mainPanel.add(redLabel);
    mainPanel.add(red, BorderLayout.CENTER);
    mainPanel.add(greenLabel);
    mainPanel.add(green, BorderLayout.CENTER);
    mainPanel.add(blueLabel);
    mainPanel.add(blue, BorderLayout.CENTER);

【讨论】:

  • 好的,太好了。我只需要为每个创建一个 JPanel。谢谢!
  • 不客气!是的,您需要预先声明 JLabels,以便您可以修改它们。如果你用 mainPanel.add() 内联创建它们,你会被一个普通标签(缺少 CSS/其他样式)卡住
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2014-04-24
相关资源
最近更新 更多