gpt4 book ai didi

java - 跟踪 Swing 组件的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 07:26:55 25 4
gpt4 key购买 nike

这就是我所得到的。

在这段代码中,我创建了一个包含 7 个 slider 和一个组合框的面板。

public JPanel createOscPanel(final Osc o)
{
//create a panel of 2 rows, 4 columns*/
JPanel panel = gc.createComponentPanel(o.NAME, 2, 4);

/*set up combobox panel*/
JPanel cbPanel = new JPanel();
cbPanel.setLayout(new BoxLayout(cbPanel, BoxLayout.Y_AXIS));

/*label*/
JPanel lbPanel = new JPanel();
lbPanel.setLayout(new BoxLayout(lbPanel, BoxLayout.X_AXIS));
lbPanel.setAlignmentY(LEFT_ALIGNMENT);
JLabel cbLabel = new JLabel("Wave Type:");
lbPanel.add(cbLabel);
cbPanel.add(lbPanel);

/*combobox*/
final String[] comboItems = {"Sine", "Custom", "FSaw", "FSquare"};
JComboBox cb = new JComboBox(comboItems);
cb.setMaximumSize(new Dimension (100, 20));

cbPanel.add(cb);

/*add sliders*/
panel.add(gc.createSliderPanel(o.getAmp(), DEFAULT_SLIDER_GRAINS));
panel.add(gc.createSliderPanel(o.getFreq(), DEFAULT_SLIDER_GRAINS));
panel.add(gc.createSliderPanel(o.getPhase(), DEFAULT_SLIDER_GRAINS));
panel.add(cbPanel);
panel.add(gc.createSliderPanel(o.getWidth(), DEFAULT_SLIDER_GRAINS));
panel.add(gc.createSliderPanel(o.getSlope(), DEFAULT_SLIDER_GRAINS));
panel.add(gc.createSliderPanel(o.getCurve(), DEFAULT_SLIDER_GRAINS));
panel.add(gc.createSliderPanel(o.getFourier(), (o.getFourier().MAX - o.getFourier().MIN)));

final Runnable disableCustomSliders = new Runnable() /*this is how do a method-in-method in Java*/
{
public void run()
{
//I need to disable sliders here.

}
};

final Runnable enableCustomSliders = new Runnable() /*this is how do a method-in-method in Java*/
{
public void run()
{

//I need to enable sliders here.
}
};

cb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox)e.getSource();
int value = cb.getSelectedIndex();

switch(value)
{
case 0: {o.setWaveShape(Osc.WaveShape.SINE); disableCustomSliders.run();} break;
case 1: {o.setWaveShape(Osc.WaveShape.CUSTOM); enableCustomSliders.run();} break;
case 2: {o.setWaveShape(Osc.WaveShape.FSAW); disableCustomSliders.run();} break;
case 3: {o.setWaveShape(Osc.WaveShape.FSQUARE);disableCustomSliders.run();} break;

}

refresh();
}
});

return panel;

}

当您在组合框中选择正弦、Fsaw、FSquare 项目时,您需要禁用曲线、宽度和斜率 slider ,而当您选择自定义项目时,您需要重新启用它们。

这里是createSliderPanel代码。

public JPanel createSliderPanel(
final Parameter parameter,
final int grains)
{
/*create and assign components*/
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createRaisedBevelBorder());

final JLabel label = new JLabel(parameter.NAME);
final JLabel valueLabel = new JLabel();

/*set up slider*/
int curr = valueToSlider(parameter.MIN.doubleValue(), parameter.MAX.doubleValue(),
parameter.getValue().doubleValue(), parameter.SCALETYPE, parameter.Q, grains);
final JSlider slider = new JSlider(JSlider.VERTICAL, 0, grains, curr);

slider.setPreferredSize(new Dimension(SLIDER_WIDTH, SLIDER_HEIGHT));

slider.setAlignmentX(Component.LEFT_ALIGNMENT);



panel.add(valueLabel);
panel.add(slider);
panel.add(label);

/*slider move event*/
slider.addChangeListener(new ChangeListener() {
/* (non-Javadoc)
* @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
*/
public void stateChanged(ChangeEvent event) {

double value = sliderToValue(parameter.MIN.doubleValue(), parameter.MAX.doubleValue(),slider.getValue(), parameter.SCALETYPE, parameter.Q, grains);

updateSliderLabel(parameter, valueLabel, parameter.getValue());

/*set the parameter value*/
if (parameter.CLASSTYPE.equals(Double.class))
parameter.setValue(value);
else if (parameter.CLASSTYPE.equals((Integer.class)))
parameter.setValue((int)value);

gui.refresh();
}


});

/*need to reset the valueLabel to it's correct format*/
updateSliderLabel(parameter, valueLabel, parameter.getValue());

return panel;
}

所以问题是 - 我如何引用这些 slider 以便对它们执行 .setEnabled(false) 操作?

我能想到的直接且相当简单的解决方案是重构createSliderPanel,这样您就可以传入父面板,并将 slider 面板添加​​到方法内的父面板,然后返回 slider 。

是否有更好的遵循 OO 和 MVC 的概念?

最后一个问题:Stack Overflow 上的有效性和礼仪 - 发布这些大块代码是否礼貌且有效?或者这会让回答问题变得更加困难?

最佳答案

我个人会创建一个自定义组件,而不是从头开始构建 slider 面板。这将使您有机会提供可用于更改整个组件的启用状态的“控制”方法,并提供可用于根据需要检索 slider 值的 getter 和 setter

关于java - 跟踪 Swing 组件的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13464599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com