JLabel перед JSplitPane

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

Вам нужна панель с компонентами или просто раскрасить фон разными цветами?

czdepski 25.10.2018 15:10

@czdepski просто раскрашивает фон разными цветами, но расположение разделителя между ними должно постоянно меняться

TheInovat 25.10.2018 15:13

Изменения при взаимодействии с пользователем? Я спрашиваю, потому что можно просто нарисовать фон (без JSplitPane), а затем вы можете поместить на него компоненты, использовать что-то вроде многослойной панели или компонентов абсолютного позиционирования, все зависит от ваших потребностей.

czdepski 25.10.2018 15:37

@czdepski нет, это не должно меняться при взаимодействии с пользователем.

TheInovat 25.10.2018 17:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как насчет использования 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);
    });
  }
}

Большое спасибо, выглядит довольно сложно, но вроде работает :)

TheInovat 25.10.2018 17:37
Ответ принят как подходящий

Учитывая ваше описание, я предпочитаю использовать подход 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. Вот результат:

Спасибо большое, не придумал такой подход!

TheInovat 27.10.2018 17:50

Другие вопросы по теме