我第一次在这里发帖提问。来过这里一段时间,享受阅读线程。希望有人在这里帮助我学习我一直在学习Java的程序。该程序调用实现滑块来更改gui背景中的背景颜色。它编译得很好,但是当我运行它时,我得到了一些错误,我在代码的末尾注释了这些错误。
代码如下:
import java.awt.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.*;
public class sliderDemo extends JFrame
{
private JSlider redSlider, greenSlider, blueSlider;
private JPanel labels, sliders, colors;
private JLabel redlabel,greenlabel, bluelabel, colorlabel;
JTextArea colorPanel;
public sliderDemo()
{
setTitle("Slider Excercise");
setLayout(new BorderLayout(5, 5));
ChangeListener event = new eventListener();
colorlabel = new JLabel("Sliders to change colors:");
redlabel = new JLabel("Red slider");
greenlabel = new JLabel("Green slider");
bluelabel = new JLabel("Blue slider");
labels = new JPanel();
labels.setLayout(new GridLayout(3,1));
labels.add(redlabel);
labels.add(greenlabel);
labels.add(bluelabel);
redSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0);
redSlider.addChangeListener(event);
redSlider.setMaximum(255);
redSlider.setPaintLabels(true);
redSlider.setPaintTicks(true);
redSlider.setMajorTickSpacing(25);
redSlider.setMinorTickSpacing(5);
redSlider.setPaintTrack(false);
greenSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0);
greenSlider.addChangeListener(event);
greenSlider.setMaximum(255);
greenSlider.setPaintLabels(true);
greenSlider.setPaintTicks(true);
greenSlider.setMajorTickSpacing(25);
greenSlider.setMinorTickSpacing(5);
greenSlider.setPaintTrack(false);
blueSlider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0);
blueSlider.addChangeListener(event);
blueSlider.setMaximum(255);
blueSlider.setPaintLabels(true);
blueSlider.setPaintTicks(true);
blueSlider.setMajorTickSpacing(25);
blueSlider.setMinorTickSpacing(5);
blueSlider.setPaintTrack(false);
sliders = new JPanel();
sliders.setLayout(new GridLayout(3,1));
sliders.add(colorlabel);
sliders.add(redSlider);
sliders.add(greenSlider);
sliders.add(blueSlider);
colorPanel = new JTextArea(10, 10);
colorPanel.setEditable(false);
colorPanel.setBackground(Color.WHITE);
colorPanel.add(sliders, BorderLayout.CENTER);
colorPanel.add(colors, BorderLayout.NORTH);
colorPanel.add(labels, BorderLayout.WEST);
colors = new JPanel(new BorderLayout(5, 5));
colors.add(colorlabel);
colors.add(colorPanel, BorderLayout.NORTH);
}
public static void main(String[] args)
{
JFrame myFrame = new sliderDemo();
myFrame.setSize(500, 500);
myFrame.setVisible(true);
myFrame.setLocationRelativeTo(null);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public class eventListener implements ChangeListener
{
public void stateChanged(ChangeEvent e)
{
int r = redSlider.getValue();
int g = greenSlider.getValue();
int b = blueSlider.getValue();
colorPanel.setBackground(new Color(r, g, b));
}
}
}
/*
Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1090)
at java.awt.Container.add(Container.java:966)
at sliderDemo.<init>(sliderDemo.java:79)
at sliderDemo.main(sliderDemo.java:89)
Press any key to continue . . .
答案 0 :(得分:2)
添加已初始化的JComponents
您尝试将JPanel colors
添加到JTextArea
(非常不在场),其初始化colors = new JPanel(new BorderLayout(5, 5));
位于下一个代码行中
将JTextArea colorPanel;
重命名为JTextArea textArea
然后您错过了第4个JPanel
,因为JTextArea colorPanel
被称为textArea
且JTextArea
不是JPanels
的容器,被指定为用户键输入
答案 1 :(得分:0)
由于mKorbel的回答还没有作为解决方案,我会尽量让它更清晰(可能要迟到):
在行
colorPanel.add(sliders, BorderLayout.CENTER);
colorPanel.add(colors, BorderLayout.NORTH);
colorPanel.add(labels, BorderLayout.WEST);
您将JPanel添加到用于彩色显示的文本区域(如mKobel所述,您应该选择更好的名称)。删除前导“colorPanel。”。这将把面板添加到主面板(正如预期的那样)。
你也必须搬家
colors = new JPanel(new BorderLayout(5, 5));
colors.add(colorlabel);
colors.add(colorPanel, BorderLayout.NORTH);
在第一个代码片段前面,在将颜色添加到布局之前,必须首先实例化“colors”。
在这些更改后,程序正在运行(我自己测试)。 :)