Swing: zmiana rozmiaru ramki JFrame jak w ramkach w systemie Linux, np
Chciałbym wiedzieć, czy istnieje możliwość zaimplementowania zmiany rozmiaru JFrame w taki sposób, że jego rozmiar został zmieniony, jak na przykład standardowe okna w Linuksie. Aby być bardziej precyzyjnym: jeśli użytkownik zacznie przeciągać, tylko przyszły rozmiar, jeśli okno zostanie wyświetlone, podczas gdy oryginalna treść nie zostanie zmieniona. Gdy tylko użytkownik zwolni mysz, ramka zmienia rozmiar do tego rozmiaru. Na zdjęciach:
(1) stan przed zmianą rozmiaru
(2) użytkownik zaczyna drage (w czerwonym kółku)
(3) użytkownik zwalnia mysz, zmienia się rozmiar ramki
Czy można to zrealizować w Java Swing?
EDYTOWAĆ:
Ponieważ ten program powinien pewnego dnia działać również w niższej wersji Java RE jako 7, starałem się łączyć sugestie mKorbel z sugestią zawartą w komentarzu z ramką translucend. Wynik jest bliski celu, poza tym
Zawartość contentPane zmienia rozmiar po zatrzymaniu ruchu myszy, a nie po zwolnieniu myszyRozmiar ramki zostaje natychmiast zmieniony, a nie tylko po zatrzymaniu przeciągania ramki.Działa tylko po zmianie rozmiaru z prawej lub dolnej strony, w przeciwnym razie zawartość przesuwa się wraz z przeciąganiem.Myślę, że pierwszy punkt można rozwiązać przez kombinację kodu i MouseListener, coś jak if mouseReleased (), a następnie zmienić rozmiar. Oto kod, spróbuj go wypróbować. W celu uzyskania dalszych sugestii wciąż jestem zadowolony z wszelkich sugestii.
Kod jest nieznaczną modyfikacją koduGradientTranslucentWindowDemo.java z samouczków Java. Mam nadzieję, że opublikowanie go tutaj jest dozwolone, w przeciwnym razie proszę wskazać mi jakiekolwiek naruszenie praw autorskich. Czarny JPanel ma być treścią aplikacji, gdzie contentPane pozostaje niewidoczny.
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);
}
});
}
}