单击单选按钮时形状发生变化的 GUI 应用程序
GUI application that the shape changes on a radio button click
我的应用程序的目的是通过单击单选按钮更改背景和前景,并根据单选按钮更改项目的形状 button.I 我正在尝试让我的应用程序主动更改基于 selected.I 单选按钮的形状具有背景和前景,而不是形状。我见过另一个 post 有点像这样,但它有一个提交按钮并且不使用 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,10);
//repaint();
}
if(ovalFillRadioButton.isSelected()){
g.fillOval(10,10,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 的 class。我也有
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,10,10);
repaint();
}
if(ovalFillRadioButton.isSelected()){
panel = myPanel.getGraphics();
panel.fillOval(10,10,10,10);
repaint();
}
}
}
我认为我不需要重绘但是当我使用这种方法时我的 JSlider 停止工作。
Am i approaching this the wrong way?
是的,paintComponent() 方法不应引用另一个 Swing 组件。
当您进行自定义绘制时,paintComponent() 应该只绘制组件的当前状态。
例如,当您使用 Jlabel 时,您可以使用 setText() 和 setIcon() 等方法来设置要绘制的文本和图标。
您已经有了一个方法,setDiameter(),这是一个好的开始。但是,您的绘画代码只是硬编码 oval/rectangle 的大小。绘画方法应该参考你的直径变量。
现在,您需要另一个 属性 来指示是绘制椭圆形还是矩形。所以也许你需要一个 属性 比如 setPaintOval(boolean paintOval)
.
那么你的绘画代码可以是:
If (paintOval)
g.fillOval(10, 10, diameter, diameter);
else
g.fillRect(10, 10, diameter, diameter);
当然这种方法的问题是你只能画两个对象。
此外,您永远不应在绘画方法中调用 repaint()。 repaint() 应该只在您更改组件状态时从您的 setter 方法中调用。
but then the slider breaks
您发布的代码与滑块无关。
我猜你想让滑块改变椭圆的直径?那么您需要向滑块添加一个 ChangeListener
,然后使用滑块值调用您的 setDiameter() 方法。
阅读 Swing 教程中关于 How to Use Sliders 的部分以获得工作示例。
我的应用程序的目的是通过单击单选按钮更改背景和前景,并根据单选按钮更改项目的形状 button.I 我正在尝试让我的应用程序主动更改基于 selected.I 单选按钮的形状具有背景和前景,而不是形状。我见过另一个 post 有点像这样,但它有一个提交按钮并且不使用 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,10);
//repaint();
}
if(ovalFillRadioButton.isSelected()){
g.fillOval(10,10,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 的 class。我也有
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,10,10);
repaint();
}
if(ovalFillRadioButton.isSelected()){
panel = myPanel.getGraphics();
panel.fillOval(10,10,10,10);
repaint();
}
}
}
我认为我不需要重绘但是当我使用这种方法时我的 JSlider 停止工作。
Am i approaching this the wrong way?
是的,paintComponent() 方法不应引用另一个 Swing 组件。
当您进行自定义绘制时,paintComponent() 应该只绘制组件的当前状态。
例如,当您使用 Jlabel 时,您可以使用 setText() 和 setIcon() 等方法来设置要绘制的文本和图标。
您已经有了一个方法,setDiameter(),这是一个好的开始。但是,您的绘画代码只是硬编码 oval/rectangle 的大小。绘画方法应该参考你的直径变量。
现在,您需要另一个 属性 来指示是绘制椭圆形还是矩形。所以也许你需要一个 属性 比如 setPaintOval(boolean paintOval)
.
那么你的绘画代码可以是:
If (paintOval)
g.fillOval(10, 10, diameter, diameter);
else
g.fillRect(10, 10, diameter, diameter);
当然这种方法的问题是你只能画两个对象。
此外,您永远不应在绘画方法中调用 repaint()。 repaint() 应该只在您更改组件状态时从您的 setter 方法中调用。
but then the slider breaks
您发布的代码与滑块无关。
我猜你想让滑块改变椭圆的直径?那么您需要向滑块添加一个 ChangeListener
,然后使用滑块值调用您的 setDiameter() 方法。
阅读 Swing 教程中关于 How to Use Sliders 的部分以获得工作示例。