【问题标题】:Custom Java Swing Meter Control自定义 Java Swing Meter 控件
【发布时间】:2011-02-23 06:58:45
【问题描述】:

我正在尝试制作一个米的自定义摆动控件。 Swing Meter http://dl.dropbox.com/u/2363305/Programming/Java/swing_meter.gif

箭头会上下移动。这是我当前的代码,但我觉得我做错了。

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LinearGradientPaint;
import java.awt.Polygon;
import java.awt.Stroke;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class meter extends JFrame {

Stroke drawingStroke = new BasicStroke(2);
Rectangle2D rect = new Rectangle2D.Double(105, 50, 40, 200);
Double meterPercent = new Double(0.57);

public meter() {

    setTitle("Meter");

    setLayout(null);

    setSize(300, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);

}

public void paint(Graphics g) {
    // Paint Meter
    Graphics2D g1 = (Graphics2D) g;
    g1.setStroke(drawingStroke);
    g1.draw(rect);

    // Set Meter Colors
    Point2D start = new Point2D.Float(0, 0);
    Point2D end = new Point2D.Float(0, this.getHeight());
    float[] dist = { 0.1f, 0.5f, 0.9f };
    Color[] colors = { Color.green, Color.yellow, Color.red };
    LinearGradientPaint p = new LinearGradientPaint(start, end, dist,
            colors);

    g1.setPaint(p);
    g1.fill(rect);

    // Make a triangle - Arrow on Meter
    int[] x = new int[3];
    int[] y = new int[3];
    int n; // count of points

    // Set Points for Arrow
    Integer meterArrowHypotenuse = (int) rect.getX();
    Integer meterArrowTip = (int) rect.getY()
            + (int) (rect.getHeight() * (1 - meterPercent));
    x[0] = meterArrowHypotenuse - 25;
    x[1] = meterArrowHypotenuse - 25;
    x[2] = meterArrowHypotenuse - 5;
    y[0] = meterArrowTip - 20; // Top Left
    y[1] = meterArrowTip + 20; // Bottom Left
    y[2] = meterArrowTip; // Tip of Arrow
    n = 3; // Number of points, 3 because its a triangle

    // Draw Arrow Border
    Polygon myTriShadow = new Polygon(x, y, n); // a triangle
    g1.setPaint(Color.black);
    g1.fill(myTriShadow);

    // Set Points for Arrow Board
    x[0] = x[0] + 1;
    x[1] = x[1] + 1;
    x[2] = x[2] - 2;
    y[0] = y[0] + 3;
    y[1] = y[1] - 3;
    y[2] = y[2];

    Robot robot = new Robot();

    Color colorMeter = robot.getPixelColor(x[2]+10, y[2]);

    // Draw Arrow
    Polygon myTri = new Polygon(x, y, n); // a triangle
    Color colr = new Color(colorMeter.getRed(), colorMeter.getGreen(), colorMeter.getBlue());
    g1.setPaint(colr);
    g1.fill(myTri);

}

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

}

感谢收看。

【问题讨论】:

    标签: java swing controls


    【解决方案1】:

    您可以在需要时使用JSlidersetValue(int n) 来设置值。你也可以change the default appearance,这样就可以得到你想要的箭头和渐变了。

    【讨论】:

    • 但是我需要使用图形,它必须是彩色的和漂亮的。我可以重新绘制 JSlider 来做到这一点吗?
    • @Tyler:是的,我用链接更新了我的答案。您可以根据需要扩展和更改所有 Swing 组件的设计。
    【解决方案2】:

    除了@Jonas 的例子,你可能还想看看文章How to Write a Custom Swing Component

    附录:经过反思,它看起来有点吓人,但您可以扩展 BasicSliderUI 并在 paintThumb()paintTrack() 中重用您的一些代码。

    JSlider slider = new JSlider();
    slider.setUI(new MySliderUI(slider));
    ...
    private static class MySliderUI extends BasicSliderUI {
    
        public MySliderUI(JSlider b) {
            super(b);
        }
    
        @Override
        public void paintTrack(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            Rectangle r = trackRect;
            g2d.setPaint(new GradientPaint(
                r.x, r.y, Color.red, r.x + r.width, r.y + r.height, Color.blue));
            g.fillRect(r.x, r.y, r.width, r.height);
        }
    
        @Override
        public void paintThumb(Graphics g) {
            super.paintThumb(g); // replace with your fill() 
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      相关资源
      最近更新 更多