Swing: изменение размера JFrame, как Frames в Linux, например
Я хотел бы знать, есть ли возможность реализовать изменение размера JFrame таким образом, чтобы он был изменен, как, например, стандартные окна в Linux. Чтобы быть более точным: если пользователь начинает делать перетаскивание, будет отображаться только будущий размер окна, если исходный контент не будет изменен. Как только пользователь отпускает мышь, рамка изменяется до этого размера. В изображениях:
(1) состояние до изменения размера
(2) пользователь начинает драже (в красном круге)
(3) пользователь отпускает мышь, рамка изменяется
Возможно ли реализовать это в Java Swing?
РЕДАКТИРОВАТЬ:
Поскольку однажды эта программа должна работать и на более низкой Java RE, как и на 7, я попытался объединить предложения mKorbel и предложение в комментарии с полупрозрачным фреймом. Результат близок к цели, за исключением того, что
Размер содержимого панели содержимого изменяется после того, как я прекращаю движение мыши, а не после отпускания мышиРазмер кадра изменяется сразу, а не только когда я прекращаю перетаскивать границу кадра.Он работает только при изменении размера справа или снизу, в противном случае содержимое перемещается при перетаскивании.Я думаю, что первая точка разрешима с помощью комбинации кода и MouseListener, что-то вроде if mouseReleased (), затем изменить размер. Вот код, не стесняйтесь попробовать. Для дальнейших предложений я все еще рад любым предложениям.
Код представляет собой небольшую модификациюGradientTranslucentWindowDemo.java из учебников Java. Я надеюсь, что разрешено публиковать это здесь, в противном случае, пожалуйста, укажите мне любое нарушение авторских прав. Предполагается, что черный JPanel является содержимым приложения, в то время как contentPane остается невидимым.
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import static java.awt.GraphicsDevice.WindowTranslucency.*;
public class GroundFrame extends JFrame {
Timer timer;
JPanel panel2;
public GroundFrame() {
super("GradientTranslucentWindow");
setBackground(new Color(0,0,0,0));
setSize(new Dimension(300,200));
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel() {
panel.setBackground(new Color(0,0,0,0));
setContentPane(panel);
setLayout(null);
panel2 = new JPanel();
panel2.setBackground(Color.black);
panel2.setBounds(0,0,getContentPane().getWidth(), getContentPane().getHeight());
getContentPane().add(panel2);
addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {}
@Override
public void componentResized(ComponentEvent e) {
timer = new Timer(50, new Action() {
@Override
public void actionPerformed(ActionEvent e) {
if(timer.isRunning()){
}else{
resizePanel(getContentPane().getSize());
}
}
@Override
public void setEnabled(boolean b) {}
@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {}
@Override
public void putValue(String key, Object value) {}
@Override
public boolean isEnabled() {return false;}
@Override
public Object getValue(String key) {return null;}
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {}
});
timer.setRepeats(false);
timer.start();
}
@Override
public void componentMoved(ComponentEvent e) {}
@Override
public void componentHidden(ComponentEvent e) {}
});
}
public void resizePanel(Dimension dim){
panel2.setBounds(0,0,dim.width, dim.height);
repaint();
}
public static void main(String[] args) {
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
boolean isPerPixelTranslucencySupported =
gd.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);
if (!isPerPixelTranslucencySupported) {
System.out.println(
"Per-pixel translucency is not supported");
System.exit(0);
}
JFrame.setDefaultLookAndFeelDecorated(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
GroundFrame gtw = new GroundFrame();
gtw.setVisible(true);
}
});
}
}