是的,一個體面的解決方案是使用一個字典,如HashTable<Integer, JLabel>
,並用JLabels填充顏色矩形的ImageIcons,使用與JSlider上適當位置相對應的Integer。例如,我的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();
}
});
}
}
如果您很快就得不到體面的答案,請考慮創建併發布[sscce](http://sscce.org)。這會讓我們更容易幫助你,並且可能會盡快爲你提供一個體面的解決方案。 –
在你的代碼中,你有一條評論,「13條排列欄下的第一個顏色。」我假設你手動校準了它,改變了這個數字,直到你在13點得到它爲止?如果是這樣,這是*不是*的方式來做到這一點。如果您在不同的操作系統上運行它,並使用不同的[外觀和感覺](http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html),會發生什麼? – wchargin
考慮爲您的JSlider使用自定義標籤表。您可以根據API使用'setLabelTable(...)'方法來設置它。 –