Как я могу установить расположение jFrame в правой части экрана? - PullRequest
0 голосов
/ 24 мая 2018
this.setLocationRelativeTo(null);

jFrame отобразится в центре экрана.Но я не знаю, как установить jFrame в правой части экрана.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы можете сделать это самостоятельно, рассчитав положение на основе размера экрана и рамки.

static void setLocationToTopRight(JFrame frame) {
    GraphicsConfiguration config = frame.getGraphicsConfiguration();
    Rectangle bounds = config.getBounds();
    Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(config);

    int x = bounds.x + bounds.width - insets.right - frame.getWidth();
    int y = bounds.y + insets.top;
    frame.setLocation(x, y);
}

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


Вот простой MCVE, демонстрирующий все четыре ребра.Нажатие одной из четырех кнопок привязывает JFrame к этому краю.

package mcve;

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

public class WindowPlacement {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Window Placement");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JButton top = new JButton("Top");
            JButton left = new JButton("Left");
            JButton bottom = new JButton("Bottom");
            JButton right = new JButton("Right");

            frame.add(top, BorderLayout.NORTH);
            frame.add(left, BorderLayout.WEST);
            frame.add(bottom, BorderLayout.SOUTH);
            frame.add(right, BorderLayout.EAST);

            top.addActionListener(e -> setLocationToTop(frame));
            left.addActionListener(e -> setLocationToLeft(frame));
            bottom.addActionListener(e -> setLocationToBottom(frame));
            right.addActionListener(e -> setLocationToRight(frame));

            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }

    // Also see:
    // https://docs.oracle.com/javase/9/docs/api/java/awt/GraphicsEnvironment.html#getMaximumWindowBounds--
    static Rectangle getMaxWindowBounds(JFrame frame) {
        GraphicsConfiguration config = frame.getGraphicsConfiguration();
        Rectangle bounds = config.getBounds();
        Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(config);
        bounds.x += insets.left;
        bounds.y += insets.top;
        bounds.width -= insets.left + insets.right;
        bounds.height -= insets.top + insets.bottom;
        return bounds;
    }

    static void setLocationToTop(JFrame frame) {
        frame.setLocation(frame.getX(), getMaxWindowBounds(frame).y);
    }

    static void setLocationToLeft(JFrame frame) {
        frame.setLocation(getMaxWindowBounds(frame).x, frame.getY());
    }

    static void setLocationToBottom(JFrame frame) {
        Rectangle bounds = getMaxWindowBounds(frame);
        frame.setLocation(frame.getX(), bounds.y + bounds.height - frame.getHeight());
    }

    static void setLocationToRight(JFrame frame) {
        Rectangle bounds = getMaxWindowBounds(frame);
        frame.setLocation(bounds.x + bounds.width - frame.getWidth(), frame.getY());
    }
}
0 голосов
/ 24 мая 2018

Если компонент не является нулевым и отображается на экране, то окно расположено таким образом, что центр окна совпадает с центром компонента.

Другими словами, выследует попробовать frame.setLocation (), а затем некоторые значения (x, y) и посмотреть, что подходит

Правка: значение 0,0 даст правильный угол, так что в вашем случае: this.setLocation (0,0);

...