【问题标题】:Java Applet JSlider widthJava Applet JSlider 宽度
【发布时间】:2012-06-03 01:09:48
【问题描述】:

我正在尝试在 JSlider 下绘制等宽的彩色矩形,以便刻度线分隔颜色。我真的很接近,但不能让它非常完美。我打印了一堆值,我的问题是滑块的宽度不是滑动条的实际长度。滑块的 x 位置也不是条的起始位置。这是我根据滑块位置设置彩色矩形边界的代码。

for(int i = 0; i < Global.emSpectrum.length; i++)  //emSpectrum.length is the number of colored rectangles
{
    emSpectrum.get(i).setColorRect(Global.emSpectrum[i], 13 + i * (int)((this.slider.getWidth())/Global.emSpectrum.length),     //13 lines up the first color under the bar
    this.slider.getY() + this.slider.getHeight()/2, (int)((this.slider.getWidth())/Global.emSpectrum.length), 
    (int)(Global.rectHeight * getHeight()));
}

有没有更好的方法来解决这个问题?

谢谢!

【问题讨论】:

  • 如果您没有很快得到合适的答案,请考虑创建并发布sscce。这将使我们更容易为您提供帮助,并且可能会更快地为您提供合适的解决方案。
  • 在您的代码中,您有一条注释,“条形下方的第一种颜色排列 13 条。”我假设您手动校准它,更改数字直到您正确设置为 13?如果是这样,这不是的方法。如果您在不同的操作系统上使用不同的look and feel 运行它会发生什么?
  • 考虑为您的 JSlider 使用自定义标签表。您可以根据 API 使用 setLabelTable(...) 方法设置它。

标签: java applet slider jslider


【解决方案1】:

是的,一个不错的解决方案是使用一个字典,例如 HashTable&lt;Integer, JLabel&gt;,并使用与 JSlider 上的适当位置相对应的整数来填充保存颜色矩形的 ImageIcons 的 JLabels。例如,我的 SSCCE:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Dictionary;
import java.util.Hashtable;

import javax.swing.*;

public class SliderEg extends JPanel {
   public static final Color[] COLORS = { Color.red, Color.orange,
         Color.yellow, Color.green, Color.blue, Color.cyan};
   private static final int BI_W = 30;
   private static final int BI_H = 10;
   private JSlider slider = new JSlider(0, 100, 0);

   public SliderEg() {
      int majorSpacing = slider.getMaximum() / (COLORS.length - 1);
      Dictionary<Integer, JLabel> dictionary = new Hashtable<Integer, JLabel>();
      slider.setMajorTickSpacing(majorSpacing);
      slider.setPaintLabels(true);
      slider.setPaintTicks(true);
      slider.setSnapToTicks(true);
      for (int i = 0; i < COLORS.length; i++) {
         ImageIcon icon = createColorIcon(COLORS[i]);
         JLabel label = new JLabel(icon);
         int key = i * majorSpacing;
         dictionary.put(key, label);
      }
      slider.setLabelTable(dictionary);

      setLayout(new BorderLayout());
      add(slider, BorderLayout.CENTER);
   }

   private ImageIcon createColorIcon(Color color) {
      BufferedImage img = new BufferedImage(BI_W, BI_H,
            BufferedImage.TYPE_INT_RGB);
      Graphics g = img.getGraphics();
      g.setColor(color);
      g.fillRect(0, 0, BI_W, BI_H);
      g.dispose();

      return new ImageIcon(img);
   }

   private static void createAndShowGui() {
      SliderEg mainPanel = new SliderEg();

      JFrame frame = new JFrame("SliderEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

【讨论】:

  • 这接近我想要的...我希望颜色在滑块的刻度上是连续的(它们之间没有空格)。
  • 我知道答案是旧的,但是是否有可能使颜色空间随着 jslider 的大小而扩展?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
相关资源
最近更新 更多