在正y方向增加jlabel的高度?

时间:2016-09-03 14:24:02

标签: java swing alignment panel jlabel

当我设置jLabel的大小时,通常它会向底部增长。如何在正y方向增加高度?

按下init后 Current Result
enter image description here

Expected result
enter image description here

我的源代码

 private void initActionPerformed(java.awt.event.ActionEvent evt) {                                     


      int p = Integer.parseInt(abc[0].getText());
      int q = Integer.parseInt(abc[1].getText());
      int r = Integer.parseInt(abc[2].getText());
      int s = Integer.parseInt(abc[3].getText());
      int t = Integer.parseInt(abc[4].getText());

    one.setSize(20, p*10 );
    one.setBackground(Color.decode("#03A9F4"));


      two.setSize(20, q*10 );
      two.setBackground(Color.decode("#03A9F4"));


      three.setSize(20, r*10 );
      three.setBackground(Color.decode("#03A9F4"));


      four.setSize(20, s*10 );
      four.setBackground(Color.decode("#03A9F4"));


      five.setSize(20, t*10 );

      five.setBackground(Color.decode("#03A9F4"));


    }        

一,二,三是标签名称。 abc是一个包含所有标签的数组

1 个答案:

答案 0 :(得分:2)

您发现Java认为正y方向图形已关闭,这与计算机显示器如何看待y方向一致。解决方案包括:

  • 找出最大尺寸,并从中减去y高度,以确定从哪里开始JLabel。
  • 更好的是,不要使用JLabel,而是使用与上面相同的计算在JPanel的paintComponent中绘制。

例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

@SuppressWarnings("serial")
public class GraphicsEg extends JPanel {
    private static final int DATA_COLUMNS = 5;
    private List<JSlider> sliders = new ArrayList<>();
    private DrawPanel drawPanel = new DrawPanel(DATA_COLUMNS);

    public GraphicsEg() {
        JPanel sliderPanel = new JPanel(new GridLayout(1, 0, 5, 5));
        SliderListener sliderListener = new SliderListener();

        for (int i = 0; i < DATA_COLUMNS; i++) {
            JSlider slider = new JSlider(0, 100, 50);
            slider.setPaintLabels(true);
            slider.setPaintTicks(true);
            slider.setPaintTrack(true);
            slider.setMajorTickSpacing(20);
            slider.setMinorTickSpacing(5);
            slider.setOrientation(SwingConstants.VERTICAL);
            slider.addChangeListener(sliderListener);
            sliders.add(slider);
            sliderPanel.add(slider);
        }

        setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        setLayout(new BorderLayout(5, 5));
        add(drawPanel, BorderLayout.CENTER);
        add(sliderPanel, BorderLayout.PAGE_END);

        sliderValuesIntoDrawPanel();
    }

    private void sliderValuesIntoDrawPanel() {
        int[] data = new int[DATA_COLUMNS];
        for (int i = 0; i < data.length; i++) {
            data[i] = sliders.get(i).getValue();
        }
        drawPanel.setData(data);
    }

    private class SliderListener implements ChangeListener {
        @Override
        public void stateChanged(ChangeEvent e) {
            sliderValuesIntoDrawPanel();
        }
    }

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

        JFrame frame = new JFrame("GraphicsEg");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

@SuppressWarnings("serial")
class DrawPanel extends JPanel {
    private static final int PREF_W = 600;
    private static final int PREF_H = 400;
    private static final int PAD = 20;
    private static final Color BORDER_COLOR = Color.BLUE;
    private static final Color COLUMN_COLOR = Color.RED;
    private static final double RELATIVE_COL_WIDTH = 2.0 / 3.0;
    private int dataColumns = 0;
    private int[] data;

    public DrawPanel(int dataColumns) {
        this.dataColumns = dataColumns;
        data = new int[dataColumns];
        setBorder(BorderFactory.createLineBorder(BORDER_COLOR));
    }

    public void setData(int[] data) {
        this.data = data;
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int i = 0; i < data.length; i++) {
            drawColumn(g, i, data[i]);
        }
    }

    private void drawColumn(Graphics g, int index, int columnHeight) {
        g.setColor(COLUMN_COLOR);
        int width = (int) (RELATIVE_COL_WIDTH * (PREF_W - 2 * PAD) / dataColumns); 
        int x = PAD + (index * (PREF_W - 2 * PAD)) / dataColumns;
        int height = (columnHeight * (PREF_H - 2 * PAD)) / 100;
        int y = PREF_H - PAD - height;
        g.fillRect(x, y, width, height);
    }
}