2016-05-14 74 views
0

我有一個JSlider,它指定了在JPanel上繪製的線的粗細。我添加了一個ChangeListener,所以當滑塊改變時,它也應該改變線條的粗細。但是當我這樣做時,厚度不會改變,相反,我會被淡化掉。當我沒有ChangeListener時,最初的顏色是紫色線條。我不明白髮生了什麼事。使用JSlider上的ChangeListener更改JPanel上的繪製線的粗細

這是我主要的GUI類,它包括JSlider的和的ChangeListener:

final JSlider slider = new JSlider(SwingConstants.HORIZONTAL, 0, 20, 1); 

    slider.setMajorTickSpacing(5); 
    slider.setMinorTickSpacing(1); 
    slider.setPaintTicks(true); 
    slider.setPaintLabels(true); 

    slider.addChangeListener(new ChangeListener() { 
     public void stateChanged(final ChangeEvent theEvent) { 
      final int stroke = slider.getValue(); 
      myDrawPanel.setStroke(stroke); 
      myDrawPanel.repaint(); 
     } 
    }); 

而且這是在該行正在制訂其他類:

public void setStroke(final int theStroke) { 
    myStroke = theStroke; 
} 

public void paintComponent(final Graphics theGraphics) { 
    super.paintComponent(theGraphics); 
    final Graphics2D g2d = (Graphics2D) theGraphics; 

    // for better graphics display 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 

    g2d.setPaint(new Color(51, 0, 111)); 
    g2d.setStroke(new BasicStroke(myStroke)); 

    g2d.draw(new Line2D.Double(myX, myY, myXEnd, myYEnd)); 

    for (Line2D l : myLines) { 
     g2d.draw(l); 
    } 
} 

這是結果如下:1

這就是我在我的paintComponent方法中硬編碼一個線條粗細數字時原來的樣子:2]

+0

當你使用'setStroke'時,你實際上是否在改變'myStroke'的值? – matt

+0

哦,我的道歉,我忘了在我的文章中包含setStroke方法,它在我的paintComponent方法之上。我會重新編輯我的帖子。 – Jasmine

+1

基於它應該工作的片段。考慮提供一個[可運行的示例](https://stackoverflow.com/help/mcve),它可以證明你的問題。這不是代碼轉儲,而是您正在做的事情的一個例子,它突出了您遇到的問題。這將導致更少的困惑和更好的反應 – MadProgrammer

回答

2

似乎爲我工作好了,我想這個問題是其他地方的代碼你不向我們展示

import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Example { 

    public static void main(String[] args) { 
     new Example(); 
    } 

    public Example() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new ControlPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class ControlPane extends JPanel { 

     public ControlPane() { 
      setLayout(new BorderLayout()); 

      DrawPane pane = new DrawPane(); 
      add(pane); 

      JSlider slider = new JSlider(0, 20, 1); 
      add(slider, BorderLayout.SOUTH); 

      slider.addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 
        pane.setStroke(slider.getValue()); 
       } 
      }); 
      slider.setValue(1); 
     } 

    } 

    public class DrawPane extends JPanel { 

     private int myStroke = 1; 

     public DrawPane() { 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     public void setStroke(int myStroke) { 
      this.myStroke = myStroke; 
      repaint(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setStroke(new BasicStroke(myStroke)); 
      g2d.drawLine(0, 0, getWidth(), getHeight()); 
      g2d.dispose(); 
     } 

    } 

} 

考慮提供runnable example這表明你的問題。這不是代碼轉儲,而是您正在做的事情的一個例子,它突出了您遇到的問題。這將導致更少的混淆和更好的反應

+0

所以我試着將你的代碼放入我的程序中,因爲我看到了兩者之間的細微差別,並認爲我錯過的東西會導致問題。但我仍然有同樣的問題。現在我在想別的東西在造成它,但我不知道是什麼。我有兩個長班。 – Jasmine

+0

將問題分解到最小的可顯示的級別,去除與問題沒有直接關係的任何事物 – MadProgrammer