2013-03-11 3 views
1

Хорошо, я знаю, что этот вопрос задан раньше, но я просто не могу заставить мое приложение работать с помощью сообщений других людей.создание кнопки - java

Я просто пытаюсь сделать экран с изображением, которое я сделал, а затем 3 кнопки (как и в игровом меню). Я сделал изображение, и теперь я пытаюсь сделать эти 3 кнопки такими.

screen

мой код на данный момент это:

public class Test { 
    static int WIDTH = 700; 
    static int HEIGHT = 600; 

    public static void main(String[] args) { 
     JLabel label = new JLabel(); 
     JFrame f = new JFrame(); 
     JPanel panel = new JPanel(); 
     JButton button = new JButton("hello again"); 
     button.addActionListener ((ActionListener) new Action1()); 

     label.setIcon(new ImageIcon("C:\\Users\\barney\\workspace\\game\\res\\background.jpg")); 
     f.add(panel); 
     f.add(label); 
     f.setVisible(true); 
     f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); 
     f.setSize(WIDTH, HEIGHT); 
     f.setResizable(false); 
     f.setLocationRelativeTo(null); 
     f.setTitle("2d platformer v1.1"); 
     f.setVisible(true); 
    } 
} 

Так как бы я добавить кнопки, как на картинке

также вы можете сказать мне, если я поставил свой код неправильно, поскольку я новичок в java.

спасибо.

+1

И проблема/вопрос ... – m0skit0

+0

@ user2099816 жестко ваш вопрос не очень ясен, что я могу получить от него, это то, что кнопки не видны. Bdw Я должен сказать, что вы добавили код и все нормально, как правило, новые пользователи этого не делают. – amod

+0

Соз, если это было не ясно, что я хотел, но в основном, как бы я сделал 3 кнопки один под друг друга (как на картинке) надеюсь, что лучше. – user2099816

ответ

4

Я думаю, вы не добавили кнопки для JFrame

f.add(button) 
+0

Учитывая тот факт, что диспетчер компоновки по умолчанию - BorderLayout, и что OP уже добавила фрейм фона в рамку, это просто заменит метку кнопкой (и заполнит весь кадр). Довольно уверен, что это не то, что хочет OP – MadProgrammer

+0

Я думаю, что OP хочет создать пользовательскую кнопку, а не кнопку «по умолчанию». – davidbuzatto

+0

Да, но просто «добавление» компонента в рамку будет переопределять то, что когда-либо находится в центре, удаляя там фона – MadProgrammer

1

Как вы хотите различные кнопки, чем кнопки свинга, чтобы сделать вещи проще, вы можете сделать кнопки в JPanel (с использованием методы paintComponent и Java 2D). Каждый JPanel будет кнопкой. Они будут использовать некоторые события мыши для обнаружения кликов и т. Д. Другой подход - это то же самое, что вы делаете со своим фоном (несколько JLabels с изображениями) и регистрируете события мыши на каждой метке. Вы также можете создать свой собственный Look And Feel для своих кнопок, но это не так просто. Конечно, вам нужно будет изменить свой менеджер макета, чтобы он соответствовал вашим кнопкам.

+0

Использование ярлыков и прослушивателей мыслей сложнее, чем делать обычную картину? Oooookkkaayyy .... в то время как разумный комментарий, я не вижу, как это помогает ответить на вопрос OP (это рано) – MadProgrammer

+0

@MadProgrammer Я сказал, что дело с обычным LAF, если не так просто. Пользовательская картина в порядке. – davidbuzatto

5

Я собираюсь быть отдавало вокруг этого ...

label.setLayout(new GridBagLayout()); 
GridBagConstraints gbc = GridBagConstraints(); 
gbc.insets = new Insets(4, 0, 4, 0); 
gbc.gridwidth = GridBagConstraints.REMAINDER; 

label.add(button, gbc); 
// add the other buttons 

Обновлено

Лично я бы создать собственный JPanel, что бы нарисовать фон, а затем добавить кнопки к нему, используя GridBagLayout сверху

Обновлено

Проблема с этим вопросом «это зависит»

Это зависит от того, как вы хотите реализовать фактические кнопки. Поскольку вы оставили пустые пробелы, я предполагаю, что вы намереваетесь отображать некоторые кнопки на изображении. Я лично, сделаю полное изображение, а затем добавлю некоторые обычные кнопки, но это ваш проект не мой.

Если вы хотите использовать что-то вроде JButton (или любого другого Component), вам понадобится менеджер компоновки, который поможет вам выровнять компоненты с оставшимися пробелами. Отсюда причина, по которой я просто делал бы хороший фон и использовал бы что-то наподобие GridBagLayout ...

Прошу прощения, я, возможно, немного понесся над доской, но мне было весело.

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.RadialGradientPaint; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.geom.RoundRectangle2D; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class ButtonImage { 

    public static void main(String[] args) { 
     new ButtonImage(); 
    } 

    public ButtonImage() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new MenuPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public static class MenuPane extends JPanel { 

     public static final Rectangle NEW_GAME_BOUNDS = new Rectangle(221, 157, 262, 85); 
     public static final Rectangle LOAD_GAME_BOUNDS = new Rectangle(221, 276, 262, 85); 
     public static final Rectangle EXIT_GAME_BOUNDS = new Rectangle(221, 396, 262, 85); 
     private BufferedImage img; 
     private Rectangle selectedBounds; 

     public MenuPane() { 
      try { 
       img = ImageIO.read(getClass().getResource("/vtr1a.jpg")); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
      MouseAdapter mouseHandler = new MouseAdapter() { 
       @Override 
       public void mouseMoved(MouseEvent e) { 
        if (getNewGameBounds().contains(e.getPoint())) { 
         System.out.println("in new"); 
         selectedBounds = getNewGameBounds(); 
        } else if (getLoadGameBounds().contains(e.getPoint())) { 
         System.out.println("in load"); 
         selectedBounds = getLoadGameBounds(); 
        } else if (getExitGameBounds().contains(e.getPoint())) { 
         System.out.println("in exit"); 
         selectedBounds = getExitGameBounds(); 
        } else { 
         selectedBounds = null; 
        } 
        repaint(); 
       } 

       @Override 
       public void mouseClicked(MouseEvent e) { 
        if (getNewGameBounds().contains(e.getPoint())) { 
         System.out.println("New Game"); 
        } else if (getLoadGameBounds().contains(e.getPoint())) { 
         System.out.println("Load Game"); 
        } else if (getExitGameBounds().contains(e.getPoint())) { 
         System.out.println("Exit Game"); 
        } 
       } 
      }; 
      addMouseListener(mouseHandler); 
      addMouseMotionListener(mouseHandler); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(), img.getHeight()); 
     } 

     protected Point getImageOffset() { 

      Point p = new Point(); 
      if (img != null) { 
       p.x = (getWidth() - img.getWidth())/2; 
       p.y = (getHeight() - img.getHeight())/2; 
      } 

      return p; 

     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      if (img != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 

       Point p = getImageOffset(); 

       g2d.drawImage(img, p.x, p.y, this); 

       drawText(g2d, "New Game", getNewGameBounds()); 
       drawText(g2d, "Load Game", getLoadGameBounds()); 
       drawText(g2d, "Exit Game", getExitGameBounds()); 

       g2d.dispose(); 
      } 
     } 

     protected void drawText(Graphics2D g2d, String text, Rectangle bounds) { 

      FontMetrics fm = g2d.getFontMetrics(); 

      g2d.setColor(Color.GRAY); 
      if (selectedBounds != null) { 
       if (bounds.contains(selectedBounds)) { 
        RadialGradientPaint rpg = new RadialGradientPaint(
          new Point(bounds.x + (bounds.width/2), bounds.y + (bounds.height/2)), 
          Math.min(bounds.width, bounds.height), 
          new float[]{0f, 1f}, 
          new Color[]{new Color(252, 180, 42), new Color(97, 205, 181)} 
          ); 
        g2d.setPaint(rpg); 
        RoundRectangle2D fill = new RoundRectangle2D.Float(bounds.x, bounds.y, bounds.width, bounds.height, 22, 22); 
        g2d.fill(fill); 
        g2d.setColor(Color.WHITE); 
       } 
      } 

      g2d.drawString(
        text, 
        bounds.x + ((bounds.width - fm.stringWidth(text))/2), 
        bounds.y + ((bounds.height - fm.getHeight())/2) + fm.getAscent()); 

     } 

     protected Rectangle getNewGameBounds() { 
      return getButtonBounds(NEW_GAME_BOUNDS); 
     } 

     protected Rectangle getLoadGameBounds() { 
      return getButtonBounds(LOAD_GAME_BOUNDS); 
     } 

     protected Rectangle getExitGameBounds() { 
      return getButtonBounds(EXIT_GAME_BOUNDS); 
     } 

     protected Rectangle getButtonBounds(Rectangle masterBounds) { 
      Rectangle bounds = new Rectangle(masterBounds); 
      Point p = getImageOffset(); 
      bounds.translate(p.x, p.y); 
      return bounds; 
     } 
    } 
} 

Вы могли бы, так же легко, использовать отдельные изображения для каждой кнопки и вместо рендеринга текста/графики, визуализации изображения в требуемом положении.

Отъезд Custom Painting и 2D Graphics для получения дополнительной информации.

+0

somone может распять вас за использование JLabel в качестве контейнера, который должен уведомлять OP о реализованных LayoutManager только для JFrame и JPanel в API напрямую, – mKorbel

+0

Да, это «маленький» hackey – MadProgrammer

+0

см. Комментарий [нашего инквизитора здесь] (http: // stackoverflow.com/questions/8575641/how-returns-xxxsize-from-jcomponents-added-to-the-jlabel) – mKorbel

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