Swing: redimensionando um JFrame como o Frames no Linux, por exemplo
Eu gostaria de saber se existe a possibilidade de implementar o redimensionamento de um JFrame dessa maneira, que ele foi redimensionado como por exemplo as janelas standart no linux. Para ser mais preciso: Se o usuário começar a arrastar, apenas o tamanho futuro, se a janela for visualizada, enquanto o conteúdo original não for redimensionado. Assim que o usuário solta o mouse, o quadro é redimensionado para esse tamanho. Nas imagens:
(1) estado antes de redimensionar
(2) usuário começa a drage (no círculo vermelho)
(3) usuário libera o mouse, o quadro é redimensionado
É possível perceber isso em Java Swing?
EDITAR:
Como este programa um dia deve rodar também em Java RE menor como o 7, tentei combinar sugestões do mKorbel com a sugestão no comentário com o Quadro translucido. O resultado está próximo do objetivo, exceto que
O conteúdo do contentPane é redimensionado depois que eu paro de mover o mouse, não quando o mouse é liberadoO título do quadro é redimensionado imediatamente, não apenas quando eu paro de arrastar a borda do quadro.Ele só funciona se redimensionado da direita ou da parte inferior, caso contrário, o conteúdo se move com o arrastar.Eu acho que o primeiro ponto é resolvido por uma combinação do código e um MouseListener, algo como se mouseReleased (), em seguida, redimensionar. Aqui está o código, fique à vontade para experimentá-lo. Para sugestões adicionais, ainda estou feliz com qualquer sugestão.
O código é uma pequena modificação doGradienteTranslucenteWindowDemo.java dos Tutoriais Java. Espero que seja permitido publicá-lo aqui, caso contrário, indique-me qualquer violação contra as causas dos direitos autorais. O JPanel preto é suposto ser o conteúdo do aplicativo, onde o contentPane permanece invisível.
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);
}
});
}
}