问题描述
我的应用程序要做的是单击单选按钮来更改背景和前景,并基于单选按钮更改项目的形状。我正在尝试让我的应用程序根据单选按钮。我的背景和前景工作的不是形状。我看到了另一种类似的帖子,但是它有一个提交按钮,并且不使用JSlider
下面是我一直在搞的,似乎无法使程序正确执行。我已经改变了形状,但是滑块断裂了。我走错路了吗?
public class ovalPanel extends JPanel
{
private int diameter = 10; // default diameter
// draw an oval of the specified diameter
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if(rectFillRadioButton.isSelected()){
g.fillRect(10,10,10);
//repaint();
}
if(ovalFillRadioButton.isSelected()){
g.filloval(10,10);
//repaint();
}
}
// validate and set diameter,then repaint
public void setDiameter(int newDiameter)
{
// if diameter invalid,default to 10
diameter = (newDiameter >= 0 ? newDiameter : 10);
repaint(); // repaint panel
}
// used by layout manager to determine preferred size
public Dimension getPreferredSize()
{
return new Dimension(200,200);
}
// used by layout manager to determine minimum size
public Dimension getMinimumSize()
{
return getPreferredSize();
}
}
这是我最初拥有的用于设置paintComponent的类。我也有
private class TopRadioButtonHandler extends JFrame implements ItemListener {
private Graphics panel;
public TopRadioButtonHandler(Graphics p) {
panel = p;
}
@Override
public void itemStateChanged(ItemEvent event) {
if(rectFillRadioButton.isSelected()){
panel = myPanel.getGraphics();
panel.fillRect(10,10);
repaint();
}
if(ovalFillRadioButton.isSelected()){
panel = myPanel.getGraphics();
panel.filloval(10,10);
repaint();
}
}
}
我认为我不需要重绘,但是当我使用此方法时,JSlider停止工作。
解决方法
我走错路了吗?
是的,paintComponent()方法不应引用另一个Swing组件。
自定义绘制时,paintComponent()应该只绘制组件的当前状态。
例如,当您使用Jlabel时,可以使用诸如setText()和setIcon()之类的方法来设置要绘制的文本和图标。
您已经有了setDiameter()方法,这是一个很好的开始。但是,您的绘画代码只是硬编码椭圆/矩形的大小。绘画方法应参考您的直径变量。
现在,您需要另一个属性来区分是绘制椭圆形还是矩形。因此,也许您需要像setPaintOval(boolean paintOval)
这样的属性。
那么您的绘画代码可能是:
If (paintOval)
g.fillOval(10,10,diameter,diameter);
else
g.fillRect(10,diameter);
当然,这种方法的问题在于您只能绘制两个对象。
此外,您永远不要在绘画方法中调用repaint()。仅当更改组件的状态时,才可以从setter方法中调用repaint()。
但随后滑块中断
您发布的代码与滑块无关。
我猜你想让滑块改变椭圆的直径吗?那么,您需要向滑块添加ChangeListener
,然后使用滑块值调用setDiameter()方法。
阅读How to Use Sliders的Swing教程中的部分,以获取工作示例。