Java нет всплывающих окон

Всплывающие окна сообщения

«Я пытался использовать JOptionPanal в своем методе, но он не работает :» — уточните, пожалуйста , «у нас не работает ». Что просходит?

Я положил код в «остальное». Когда кнопка нажата с неправильным сравнением, нет всплывающих окон и никаких сообщений об ошибках Java

Тогда что-то не так с вашей логикой, но, скорее всего, в коде, который вы нам не показываете. Вы уверены, что блок else еще введен? Поместили ли вы операторы println в блок else, чтобы показать, что он введен и, несмотря на то, что он введен, JOptionPane не отображается? Вы должны сделать некоторую отладку здесь.

Чтобы подтвердить Hovercraft Full of Eels: работает часть JOptionPane. (Поместите это в свой основной, вы увидите :)).

@RUiHAO Добавьте System.out.println(«else») в ветку else , чтобы подтвердить, что код туда попал, или установить точку останова в отладчике.

9 ответов

javax.swing.JOptionPane

Вот код метода, который я вызываю всякий раз, когда я хочу, чтобы информационное окно всплывало, оно запускает экран до тех пор, пока он не будет принят:

import javax.swing.JOptionPane; public class ClassNameHere < public static void infoBox(String infoMessage, String titleBar) < JOptionPane.showMessageDialog(null, infoMessage, "InfoBox: " + titleBar, JOptionPane.INFORMATION_MESSAGE); >> 

Первый параметр JOptionPane ( null в этом примере) используется для выравнивания диалога. null заставляет его центрировать себя на экране, однако любой java.awt.Component может быть указан, и вместо этого диалог появится в центре этого Component .

Я обычно использую titleBar String для описания того, где в коде, из которого вызывается ящик, таким образом, если он раздражает, я могу легко отследить и удалить код, ответственный за рассылку моего экрана с помощью infoBoxes.

Чтобы использовать этот вызов метода:

ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE"); 

javafx.scene.control.Alert

Подробное описание того, как использовать диалоги JavaFX, см. в разделе Диалоги JavaFX (официальный) с помощью code.makery. Они гораздо более мощные и гибкие, чем диалоги Swing, и способны гораздо больше, чем просто всплывающие сообщения.

Как и выше, я опубликую небольшой пример того, как вы могли бы использовать диалоги JavaFX для достижения того же результата

import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.application.Platform; public class ClassNameHere < public static void infoBox(String infoMessage, String titleBar) < /* By specifying a null headerMessage String, we cause the dialog to not have a header */ infoBox(infoMessage, titleBar, null); >public static void infoBox(String infoMessage, String titleBar, String headerMessage) < Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle(titleBar); alert.setHeaderText(headerMessage); alert.setContentText(infoMessage); alert.showAndWait(); >> 

Следует иметь в виду, что JavaFX представляет собой однопоточный набор инструментов GUI, что означает, что этот метод следует вызывать непосредственно из потока приложений JavaFX. Если у вас есть другой поток, выполняющий работу, для которого требуется диалог, см. Эти SO Q & As: JavaFX2: могу ли я приостановить фоновое задание/услугу? и «Платформа» и «Javafx» .

Чтобы использовать этот вызов метода:

ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE"); 
ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE", "HEADER MESSAGE"); 

Приведенный выше комментарий означает, что на панели задач нет отдельного значка для диалога. Это потому, что это не уникальное окно, это дочерний элемент главного окна вашего приложения. Чтобы обеспечить отдельную иконку на панели задач, вам придется вручную создать и заполнить новое автономное окно (хотя ИМХО оно редко стоит усилий)

Читайте также:  Process

сначала нужно импортировать: импортировать javax.swing.JOptionPane; то вы можете вызвать его, используя это:

JOptionPane.showMessageDialog(null, "ALERT MESSAGE", "TITLE", JOptionPane.WARNING_MESSAGE); 

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

Да, но это наиболее полезно, потому что я отсканировал длинные ответы, и это был единственный ответ, к которому привлекли мои глаза

Пара «улучшений», которые я использую для отладки, особенно при запуске проектов (т.е. не в режиме отладки).

  1. По умолчанию в заголовке окна сообщения указывается имя вызывающего метода. Это удобно для остановки потока в заданной точке, но должно быть очищено перед выпуском.
  2. Автоматически скопируйте имя абонента и сообщение в буфер обмена, потому что вы не можете искать изображение!
package forumposts; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import javax.swing.JOptionPane; public final class MsgBox < public static void info(String message) < info(message, theNameOfTheMethodThatCalledMe()); >public static void info(String message, String caller) < show(message, caller, JOptionPane.INFORMATION_MESSAGE); >static void error(String message) < error(message, theNameOfTheMethodThatCalledMe()); >public static void error(String message, String caller) < show(message, caller, JOptionPane.ERROR_MESSAGE); >public static void show(String message, String title, int iconId) < setClipboard(title+":"+NEW_LINE+message); JOptionPane.showMessageDialog(null, message, title, iconId); >private static final String NEW_LINE = System.lineSeparator(); public static String theNameOfTheMethodThatCalledMe() < return Thread.currentThread().getStackTrace()[3].getMethodName(); >public static void setClipboard(String message) < CLIPBOARD.setContents(new StringSelection(message), null); // nb: we don't respond to the "your content was splattered" // event, so it OK to pass a null owner. >private static final Toolkit AWT_TOOLKIT = Toolkit.getDefaultToolkit(); private static final Clipboard CLIPBOARD = AWT_TOOLKIT.getSystemClipboard(); > 

Источник

Java нет всплывающих окон

Для создания простых уведомлений в Android используется класс Toast . Фактически Toast представляет всплывающее окно с некоторым текстом, которое отображается в течение некоторого времени.

Объект Toast нельзя создать в коде разметки xml, например, в файл activity_main.xml . Toast можно использовать только в коде java.

Так, определим в файле разметки activity_main.xml кнопку:

У кнопки установлен обработчик нажатия — метод onClick. Определим его в коде MainActivity:

package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >public void onClick(View view) < Toast toast = Toast.makeText(this, "Hello Android!",Toast.LENGTH_LONG); toast.show(); >>

В обработчике отображается всплывающее окно. Для его создания применяется метод Toast.makeText() , в который передается три параметра: текущий контекст (текущий объект activity), отображаемый текст и время отобажения окна.

В качестве времени показа окна мы можем использовать целочисленное значение — колическо миллисекунд или встроенные константы Toast.LENGTH_LONG (3500 миллисекунд) и Toast.LENGTH_SHORT (2000 миллисекунд).

Для самого отображения окна вызывается метод show() :

Toast в Android и Java

По умолчанию окно отображается внизу интерфейса с центрированием по центру. Но мы можем кастомизировать позиционирование окна с помощью методов setGravity() и setMargin() . Так, изменим метод onClick:

public void onClick(View view) < Toast toast = Toast.makeText(this, "Hello Android!", Toast.LENGTH_LONG); toast.setGravity(Gravity.TOP, 0,160); // import android.view.Gravity; toast.show(); >

Первый параметр метода setGravity указывает, в какой части контейнера надо позиционировать Toast, второй и третий параметр устанавливают отступы от этой позиции по горизонтали и вертикали сооветственно:

Позиционирование toast в Android и Java

Метод setMargin() принимает два параметра: отступ от левой границы контейнера в процентах от шиирины контейнера и отступ от верхней границы в процентах от длины контейнера.

Источник

Как создать всплывающее окно (PopupWindow) в Android

Изображение 15036

в моем popup_example.xml . Как я могу обработать эти два компонента в моем коде Java?

Эй, могу ли я использовать всплывающее окно, чтобы показать увеличенное изображение (по щелчку изображения), которое динамически отображается в виде списка? Благодарю.

8 ответов

Здесь я даю вам демонстрационный пример. См. Это и настройте его в соответствии с вашими потребностями.

public class ShowPopUp extends Activity < PopupWindow popUp; LinearLayout layout; TextView tv; LayoutParams params; LinearLayout mainLayout; Button but; boolean click = true; @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); popUp = new PopupWindow(this); layout = new LinearLayout(this); mainLayout = new LinearLayout(this); tv = new TextView(this); but = new Button(this); but.setText("Click Me"); but.setOnClickListener(new OnClickListener() < public void onClick(View v) < if (click) < popUp.showAtLocation(layout, Gravity.BOTTOM, 10, 10); popUp.update(50, 50, 300, 80); click = false; >else < popUp.dismiss(); click = true; >> >); params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layout.setOrientation(LinearLayout.VERTICAL); tv.setText("Hi this is a sample text for popup window"); layout.addView(tv, params); popUp.setContentView(layout); // popUp.showAtLocation(layout, Gravity.BOTTOM, 10, 10); mainLayout.addView(but, params); setContentView(mainLayout); > > 

Надеюсь, что это решит вашу проблему.

Как сделать простое всплывающее окно Android

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

Изображение 120558

Сделать макет для всплывающего окна

Добавьте файл макета в res/layout который определяет, как будет выглядеть всплывающее окно.

Надуйте и покажите всплывающее окно

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

public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >public void onButtonShowPopupWindowClick(View view) < // inflate the layout of the popup window LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); View popupView = inflater.inflate(R.layout.popup_window, null); // create the popup window int width = LinearLayout.LayoutParams.WRAP_CONTENT; int height = LinearLayout.LayoutParams.WRAP_CONTENT; boolean focusable = true; // lets taps outside the popup also dismiss it final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable); // show the popup window // which view you pass in doesn't matter, it is only used for the window tolken popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0); // dismiss the popup window when touched popupView.setOnTouchListener(new View.OnTouchListener() < @Override public boolean onTouch(View v, MotionEvent event) < popupWindow.dismiss(); return true; >>); > > 

Продолжается

Изображение 120559

Изображение 120560

Дальнейшее обучение

Они также помогли узнать, как создать всплывающее окно:

Вы сделали с раздуванием макета? возможно, вы можете попробовать это!

View myPoppyView = pw.getContentView(); Button myBelovedButton = (Button)myPoppyView.findViewById(R.id.my_beloved_button); //do something with my beloved button? :p 

Я создаю свой собственный класс, а затем вызываю его из своей активности, переопределяя небольшие методы, такие как showAtLocation. Я нашел его легче, когда у меня есть 4-5 всплывающих окон в моей деятельности, чтобы сделать это.

public class ToggleValues implements OnClickListener < private View pView; private LayoutInflater inflater; private PopupWindow pop; private Button one, two, three, four, five, six, seven, eight, nine, blank; private ImageButton eraser; private int selected = 1; private Animation appear; public ToggleValues(int id, Context c, int screenHeight)< inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); pop = new PopupWindow(inflater.inflate(id, null, false), 265, (int)(screenHeight * 0.45), true); pop.setBackgroundDrawable(c.getResources().getDrawable(R.drawable.alpha_0)); pView = pop.getContentView(); appear = AnimationUtils.loadAnimation(c, R.anim.appear); one = (Button) pView.findViewById(R.id.one); one.setOnClickListener(this); two = (Button) pView.findViewById(R.id.two); two.setOnClickListener(this); three = (Button) pView.findViewById(R.id.three); three.setOnClickListener(this); four = (Button) pView.findViewById(R.id.four); four.setOnClickListener(this); five = (Button) pView.findViewById(R.id.five); five.setOnClickListener(this); six = (Button) pView.findViewById(R.id.six); six.setOnClickListener(this); seven = (Button) pView.findViewById(R.id.seven); seven.setOnClickListener(this); eight = (Button) pView.findViewById(R.id.eight); eight.setOnClickListener(this); nine = (Button) pView.findViewById(R.id.nine); nine.setOnClickListener(this); blank = (Button) pView.findViewById(R.id.blank_Selection); blank.setOnClickListener(this); eraser = (ImageButton) pView.findViewById(R.id.eraser); eraser.setOnClickListener(this); >public void showAtLocation(View v) < pop.showAtLocation(v, Gravity.BOTTOM | Gravity.LEFT, 40, 40); pView.startAnimation(appear); >public void dismiss() < pop.dismiss(); >public boolean isShowing() < if(pop.isShowing())< return true; >else < return false; >> public int getSelected() < return selected; >public void onClick(View arg0) < if(arg0 == one)< Sudo.setToggleNum(1); >else if(arg0 == two)< Sudo.setToggleNum(2); >else if(arg0 == three)< Sudo.setToggleNum(3); >else if(arg0 == four)< Sudo.setToggleNum(4); >else if(arg0 == five)< Sudo.setToggleNum(5); >else if(arg0 == six)< Sudo.setToggleNum(6); >else if(arg0 == seven)< Sudo.setToggleNum(7); >else if(arg0 == eight)< Sudo.setToggleNum(8); >else if(arg0 == nine)< Sudo.setToggleNum(9); >else if(arg0 == blank)< Sudo.setToggleNum(0); >else if(arg0 == eraser) < Sudo.setToggleNum(-1); >this.dismiss(); > > 
LayoutInflater inflater = (LayoutInflater) SettingActivity.this.getSystemService(SettingActivity.LAYOUT_INFLATER_SERVICE); PopupWindow pw = new PopupWindow(inflater.inflate(R.layout.gd_quick_action_slide_fontsize, null),LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT, true); pw.showAtLocation(SettingActivity.this.findViewById(R.id.setting_fontsize), Gravity.CENTER, 0, 0); View v= pw.getContentView(); TextView tv=v.findViewById(R.id. ); 

Источник

Как сделать всплывающее окно в Java

В настоящее время я разрабатываю Java-приложение. Я хочу показать новое окно, которое содержит текстовую область и кнопку. Есть ли у вас идеи?

@NoName NoName, наверное, нет. Он все еще активен . последний раз его видели 6 марта. Еще некоторое время, но все же.

6 ответов

package experiments; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; public class CreateDialogFromOptionPane < public static void main(final String[] args) < final JFrame parent = new JFrame(); JButton button = new JButton(); button.setText("Click me to show dialog!"); parent.add(button); parent.pack(); parent.setVisible(true); button.addActionListener(new java.awt.event.ActionListener() < @Override public void actionPerformed(java.awt.event.ActionEvent evt) < String name = JOptionPane.showInputDialog(parent, "What is your name?", null); >>); > > 

Изображение 133267

Хм прошло немного времени, но из того, что я помню.
Если вы хотите создать собственное окно, вы можете просто создать новый фрейм и показать его так же, как и в главном окне. Java также имеет отличную библиотеку диалога, которую вы можете проверить здесь:

Это может дать вам функциональность, которую вы ищете, с гораздо меньшими усилиями.

Object[] possibilities = ; String s = (String)JOptionPane.showInputDialog( frame, "Complete the sentence:\n" + "\"Green eggs and. \"", "Customized Dialog", JOptionPane.PLAIN_MESSAGE, icon, possibilities, "ham"); //If a string was returned, say so. if ((s != null) && (s.length() > 0)) < setLabel("Green eggs and. " + s + "!"); return; >//If you're here, the return value was null/empty. setLabel("Come on, finish the sentence!"); 

Если вы не хотите ограничивать выбор пользователя, вы можете либо использовать форму метода showInputDialog, которая принимает меньше аргументов, либо задает значение null для массива объектов. В представлении Java, заменяя нуль для возможностей, появляется диалоговое окно с текстовым полем и выглядит так:

Источник

Оцените статью