代码之家  ›  专栏  ›  技术社区  ›  jwir3

如何计算JComponent的剪切矩形?

  •  2
  • jwir3  · 技术社区  · 14 年前

    基本上,我想做的是在可以绘制的组件的可见区域内创建更多的空间,但只在已经绘制的区域之上。例如,在下图中,我有三个滑块:

    slider bars

    所以,我的问题是“当传入paintComponent()方法时,如何计算图形对象中的剪切矩形?”我似乎找不到系统如何确定给定组件的剪裁界限。

    谢谢,

    ~斯科特

    1 回复  |  直到 14 年前
        1
  •  2
  •   Community CDub    7 年前

    这个 java.awt.Graphics API提到,“用户剪辑和设备剪辑的组合定义了复合剪辑,它决定了最终的剪辑区域”,但是剪辑与您的问题并不真正相关。你可能想用一个合适的布局来代替。 Box layout Using Invisible Components as Filler ,在这种情况下可能有用。

    附录:

    paintComponent() 在里面 JSlider .

    阿法克, 油漆组件() 只是委托给 javax.swing.plaf.SliderUI . 这个 example 可能会建议一种方法。

    alt text

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import javax.swing.BorderFactory;
    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSlider;
    
    /** @see https://stackoverflow.com/questions/3971972 */
    public class JSliderTest extends JPanel {
    
        public JSliderTest() {
            super(new GridLayout(0, 1));
            this.setPreferredSize(new Dimension(500, 400));
            this.add(genSliderPanel());
            this.add(genSliderPanel());
            this.add(genSliderPanel());
        }
    
        private JPanel genSliderPanel() {
            JPanel panel = new JPanel();
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
            panel.setBorder(BorderFactory.createLineBorder(Color.red));
            JSlider slider = new JSlider(JSlider.HORIZONTAL);
            slider.setValue(40);
            slider.setMajorTickSpacing(20);
            slider.setPaintTicks(true);
            slider.setPaintLabels(true);
            panel.add(Box.createVerticalGlue());
            panel.add(slider);
            panel.add(Box.createRigidArea(new Dimension(16, 16)));
            return panel;
        }
    
        private void display() {
            JFrame f = new JFrame("JSliderTest");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(this);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new JSliderTest().display();
                }
            });
        }
    }