2013-06-10 4 views
0

Хорошо, я хочу разместить свою кнопку в определенном месте на экране. Есть ли способ разместить его в точном местоположении пикселей? Сейчас он помещает его в крайнее правое окно. У меня есть образ, который я бы хотел, чтобы он тоже перешел.Как поставить кнопку, где я хочу на экране.

import java.awt.AWTException; 
import java.awt.FlowLayout; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.InputEvent; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBuffer; 
import java.awt.image.DataBufferInt; 
import java.awt.image.WritableRaster; 

import javax.swing.BorderFactory; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 

public class UnfollowGUI extends JFrame{ 

private JLabel label; 
private JButton button; 

private ImageIcon bgi; 
private JLabel bgl; 

public static Rectangle gameSquare; 

public static boolean rock = true; 
public static boolean runningMine = true; 
public static int stray = 0; 
public static int strayCount = 0; 


public static void main(String[] args) { 
    UnfollowGUI gui = new UnfollowGUI(); 
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // when click x close program 
    //gui.setSize(886, 266); 
    gui.pack(); 
    gui.setVisible(true); 
    gui.setTitle("Solid Cloud Inc - Twitter Unfolower"); 
} 

public UnfollowGUI(){ 

    setLayout(new FlowLayout()); 

    bgi = new ImageIcon(getClass().getResource("tu.png")); 
    bgl = new JLabel (bgi); 
    add(bgl); 

    ImageIcon start = new ImageIcon(getClass().getResource("start.png")); 
    button = new JButton (start); 
    button.setBorder(BorderFactory.createEmptyBorder()); 
    button.setContentAreaFilled(false); 

    add(button); 

    label = new JLabel (""); 
    add(label); 

    Events e = new Events(); 
    button.addActionListener(e); 
} 

public class Events implements ActionListener { 


    public void actionPerformed(ActionEvent e) { 

     if (e.getSource() == button) { 
      label.setText("Searching"); 
      try { 
      Unfollow(); 
     } catch (InterruptedException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     } 
} 

} 

ответ

0

Вы можете разместить вещи в нужном месте, не используя диспетчер компоновки. Это называется абсолютным позиционированием, и вы можете прочитать учебник по нему здесь: http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html

Вот фрагмент кода из внутри этого учебника:

pane.setLayout(null); 

JButton b1 = new JButton("one"); 
JButton b2 = new JButton("two"); 
JButton b3 = new JButton("three"); 

pane.add(b1); 
pane.add(b2); 
pane.add(b3); 

Insets insets = pane.getInsets(); 
Dimension size = b1.getPreferredSize(); 
b1.setBounds(25 + insets.left, 5 + insets.top, 
      size.width, size.height); 
size = b2.getPreferredSize(); 
b2.setBounds(55 + insets.left, 40 + insets.top, 
      size.width, size.height); 
size = b3.getPreferredSize(); 
b3.setBounds(150 + insets.left, 15 + insets.top, 
      size.width + 50, size.height + 20); 

...//In the main method: 
Insets insets = frame.getInsets(); 
frame.setSize(300 + insets.left + insets.right, 
       125 + insets.top + insets.bottom); 

Это заканчивает тем, как это:

enter image description here

+0

, но если и не использовать редактор графический интерфейс, как mattise весьма обескуражен не используя менеджер компоновки :) – nachokk

+0

@nachokk я не знаю никакого другого способа поставить кнопку на точные пиксели, которые вы хотите. –

+0

Мне не нужно, но нужно быть осторожным, много магических чисел, если у вас нет редактора gui, это не полезно. :) – nachokk

3

Java GUI, возможно, придется работать на нескольких платформах, на разных разрешениях экрана &, используя различные PLAF. Таким образом, они не способствуют точному размещению компонентов.

Чтобы организовать компоненты для надежного графического интерфейса, вместо этого используйте диспетчеры макетов (или их комбинации), а также прокладку макета & границ для пробелов.

3

Еще один способ добиться того, что вы описали, можно сделать таким образом (есть много альтернатив, но в конце концов все зависит от того, как вы хотите, чтобы ваши компоненты были относительно позиционированы друг с другом и что происходит, когда размер изменения родительского контейнера):

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.FlowLayout; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestLoginGridBagLayout { 

    protected void initUI() throws MalformedURLException { 
     JFrame frame = new JFrame("Background image"); 
     frame.getContentPane().setBackground(Color.BLACK); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JLabel background = new JLabel(new ImageIcon(new URL("http://images2.layoutsparks.com/1/161318/city-lights-bridge-decoration.jpg"))); 
     background.setVerticalAlignment(JLabel.BOTTOM); 
     background.setHorizontalAlignment(JLabel.LEFT); 
     background.setLayout(new BorderLayout()); 
     frame.add(background); 
     JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); 
     buttonPanel.setOpaque(false); 
     buttonPanel.add(new JButton("Some button in the bottom left")); 
     background.add(buttonPanel, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        new TestLoginGridBagLayout().initUI(); 
       } catch (MalformedURLException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 
Смежные вопросы