#java #swing #mouseevent #jbutton #null-layout-manager
#java #качать #mouseevent #jbutton #null-layout-manager
Вопрос:
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.imageio.*;
import java.lang.*;
import java.io.*;
import javax.swing.*;
public class MainClass extends Component{
private Image bg;
private ImageIcon newgame;
private ImageIcon quit;
private ImageIcon options;
private JButton bquit;
private JButton boptions;
private JButton bnewgame;
private static Container pane; //Container
public void loadImage() {
try {
bg=ImageIO.read(new File("bg1.png"));
} catch (Exception e) {
}
if(bg!=null)
repaint();
}
public void paint(Graphics g) {
g.drawImage(bg,0,0,null);
}
public void imageButtons(JFrame f) {
try {
quit= new ImageIcon("quit.png");
options=new ImageIcon("options.png");
newgame= new ImageIcon("newgame.png");
}catch(Exception e){}
bnewgame= new JButton(newgame);
boptions= new JButton(options);
bquit= new JButton(quit);
bnewgame.setBounds(150,100,400,89);
boptions.setBounds(150,200,400,89);
bquit.setBounds(150,300,400,89);
pane.add(bquit);
pane.add(boptions);
pane.add(bnewgame);
}
public static void main(String args[]) {
MainClass o=new MainClass();
FullScreen fs=new FullScreen();
JFrame f1=new JFrame("TITLE");
pane=f1.getContentPane();
fs.fullScreenIt(f1);
pane.add(o);
f1.setVisible(true);
o.loadImage();
o.imageButtons(f1);
}
}
Полноэкранный режим — это еще один класс, который предоставляет полноэкранный режим.
На JButton есть значок изображения. bg1.png — фоновое изображение
Проблема в том, что эти JButton становятся видимыми только при наведении курсора мыши, иначе они не отображаются.
Ответ №1:
добавьте значок / изображение непосредственно в JButton вместо paint()
для AWT или paintComponent()
для Swing JComponents
Конструктор JButton(значок) знает значок или значок изображения
из кода
import java.awt.*;
import javax.swing.*;
public class ButtonsIcon extends JFrame {
private static final long serialVersionUID = 1L;
private ImageIcon errorIcon = (ImageIcon) UIManager.getIcon("OptionPane.errorIcon");
private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon");
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ButtonsIcon t = new ButtonsIcon();
}
});
}
public ButtonsIcon() {
setLayout(new GridLayout(0, 2, 4, 4));
JButton button = new JButton();
button.setBorderPainted(false);
button.setBorder(null);
button.setFocusable(false);
button.setMargin(new Insets(0, 0, 0, 0));
button.setContentAreaFilled(false);
button.setIcon((errorIcon));
button.setRolloverIcon((infoIcon));
button.setPressedIcon(warnIcon);
button.setDisabledIcon(warnIcon);
add(button);
JButton button1 = new JButton();
button1.setBorderPainted(false);
button1.setBorder(null);
button1.setFocusable(false);
button1.setMargin(new Insets(0, 0, 0, 0));
button1.setContentAreaFilled(false);
button1.setIcon((errorIcon));
button1.setRolloverIcon((infoIcon));
button1.setPressedIcon(warnIcon);
button1.setDisabledIcon(warnIcon);
add(button1);
button1.setEnabled(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
Комментарии:
1. я использовал paint для рисования этого фонового изображения bg1.png
2. @Harvinder Singh Sidhu у вас есть два правильных ответа ( 1) на ваш вопрос, тогда зачем публиковать еще одно предложение с двумя правильными ответами
3. @mKorbel: Это замечательно, никогда не пробовал использовать границы и область содержимого. Вы всегда готовы научить чему-то новому 🙂 Спасибо.
4. рад видеть вас здесь снова 🙂
Ответ №2:
Вероятно, у вас проблема с компоновкой, когда вы пытаетесь добавить JButtons с абсолютными границами в контейнер, который использует ненулевой менеджер компоновки. Предложения
- Не используйте setBounds и абсолютное позиционирование для определения размера и размещения ваших компонентов.
- Прочитайте и используйте менеджеры компоновки, чтобы выполнить эту тяжелую работу за вас: Урок: размещение компонентов в контейнере
- Не забудьте вызвать
pack()
свой JFrame после добавления всех компонентов - Вызывайте
setVisible(true)
после вызоваpack()
и снова вызывайте оба только после добавления всех компонентов в ваш графический интерфейс. - Нулевой макет доступен, если вам абсолютно необходимо использовать абсолютное позиционирование компонентов, но, несмотря на это, вы должны стремиться избегать его использования.
Комментарии:
1. Хорошо, еще одна вещь, куда я должен добавить это фоновое изображение? Для панели // контейнера или для рамки f1?
2. нулевой макет создает больше проблем, потому что он заставляет первую кнопку (которая является bnewgame) рисовать на весь экран, полноэкранную кнопку, больше ничего на экране, что ужасно, я пробовал использовать менеджеры макетов, но они усложняют ситуацию, и фоновое изображение не будет отображаться
3. на самом деле это не часть этого вопроса, а отдельный вопрос. Я предлагаю вам поискать на этом форуме, чтобы добавить фоновые изображения в графический интерфейс Swing, а затем вернуться, если вы все еще застряли. Что касается вашего второго утверждения, это означает только то, что вы используете их неправильно, но не означает, что вы не должны их использовать.
4. Хорошо, спасибо за помощь, но проблема была не в диспетчере компоновки, я решил ее.
Ответ №3:
Похоже, вы никогда не перерисовываете после добавления своих кнопок.
Я бы добавил туда перерисовку после того, как вы их добавите.
Ответ №4:
Только что была аналогичная проблема…
Я считаю, что сбой вызван переопределением метода paint(). Метод paint() по умолчанию автоматически вызывает repaint() для всех компонентов, но при переопределении метода paint() компоненты перестают перерисовываться. Итак, решение состоит в том, чтобы вызвать repaint() для всех компонентов с переопределенным методом paint().
Сработало для меня, надеюсь, это сработает для других ;)..