0

これが私が持っているものです。

このコードでは、7 つのスライダーとコンボボックスを含むパネルを作成しています。

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; 

}

コンボボックスで Sine、Fsaw、FSquare の項目を選択した場合は、Curve、Width、および Slope スライダーを無効にする必要があります。Custom 項目を選択した場合は、それらを再度有効にする必要があります。

これが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; 
}

問題は、これらのスライダーを参照して .setEnabled(false) を実行するにはどうすればよいかということです。

私が考えることができる即時かつ合理的に単純な解決策はcreateSliderPanel、親パネルを渡し、スライダー パネルをメソッド内の親に追加し、スライダーを返すようにリファクタリングすることです。

オブジェクト指向と MVC に準拠するより良い概念はありますか?

最後にもう 1 つ質問があります: スタック オーバーフローの有効性とエチケット - これらの大量のコードを投稿することはマナーがよく、効果的ですか? それとも質問に答えるのが難しくなりますか?

4

1 に答える 1

2

個人的には、スライダー パネルをゼロから作成するのではなく、カスタム コンポーネントを作成します。これにより、必要に応じてスライダーの値を取得するために使用できるゲッターとセッターを提供するだけでなく、コンポーネント全体の有効な状態を変更するために使用できる「コントロール」メソッドを提供する機会が得られます。

于 2012-11-20T00:15:06.037 に答える