JLabel перед JSplitPane - PullRequest
       23

JLabel перед JSplitPane

0 голосов
/ 25 октября 2018

Моя цель - иметь окно с двумя панелями разных цветов на заднем плане.Каждый из них покрывает определенный процент экрана, и это периодически меняется.Я сделал это, создав JSplitPane.Но теперь я хочу добавить JLabel, показывающий некоторые данные перед всем этим в середине экрана.Как бы я это сделал?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Учитывая ваше описание, я предпочитаю использовать paintComponent подход.Вы просто рисуете 2 прямоугольника на фоне компонентов и по-прежнему располагаете компоненты, как обычно, так просто:

  JFrame f = new JFrame();
  f.setPreferredSize(new Dimension(600, 600));
  f.pack();
  f.setLayout(new BorderLayout());
  JPanel p = new JPanel(new FlowLayout()) {
     @Override
     protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int perc = (int)((float)getWidth()*0.3f); // set % to fill
        g.setColor(Color.RED);
        g.fillRect(0, 0, perc, g.getClipBounds().height);
        g.setColor(Color.BLUE);
        g.fillRect(perc, 0, getWidth()-perc, getHeight());
     }

  };
  f.add(p);
  p.add(new JButton("test"));
  f.setVisible(true);

Мой пример делает это на JPanel, но это можно сделать непосредственно на JFrameи затем помещает JButton поверх него, используя FlowLayout.Вот результат:

enter image description here

0 голосов
/ 25 октября 2018

Как насчет использования JLayer: Как декорировать компоненты с помощью класса JLayer (Учебные руководства по Java ™> Создание графического интерфейса с помощью JFC / Swing> Использование других функций Swing)

screenshot

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.*;

public class JLayerTest {
  public Component makeUI() {
    JSplitPane splitPane = new JSplitPane();
    splitPane.setResizeWeight(.4);
    splitPane.setLeftComponent(makeLabel(Color.RED));
    splitPane.setRightComponent(makeLabel(Color.GREEN));
    //splitPane.setEnabled(false);
    //splitPane.setDividerSize(0);

    JPanel rubberStamp = new JPanel();
    JLabel label = makeLabel(Color.BLUE);
    label.setText("JLabel");
    label.setForeground(Color.WHITE);
    label.setBorder(BorderFactory.createLineBorder(Color.BLUE, 50));
    LayerUI<JSplitPane> layerUI = new LayerUI<JSplitPane>() {
      @Override public void paint(Graphics g, JComponent c) {
        super.paint(g, c);
        Dimension d = label.getPreferredSize();
        int x = (c.getWidth()  - d.width) / 2;
        int y = (c.getHeight() - d.height) / 2;
        SwingUtilities.paintComponent(g, label, rubberStamp, x, y, d.width, d.height);
      }
    };
    return new JLayer<>(splitPane, layerUI);
  }
  public static JLabel makeLabel(Color color) {
    JLabel label = new JLabel();
    label.setOpaque(true);
    label.setBackground(color);
    return label;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new JLayerTest().makeUI());
      f.setSize(320, 240);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}
...